/ / Usuń pozycję z listy rekordów - clojure

Usuń pozycję z listy rekordów - clojure

Mam następującą strukturę:

(defrecord Member [id name salary role])
(defrecord Project [id name duration])
(defrecord ProjectMember [project member])

(def project-member-records (ref ()))

(defn find-project-member-record [parm-proj-id parm-member-id]
(filter #(let [project (.project %)
member (.member %)
proj-id (:id project)
member-id (:id member)]
(and (= proj-id parm-proj-id)
(= member-id parm-member-id))) @project-member-records))

;;Sample func, does not work
(defn remove-project-member-record [proj-id member-id]
(dosync (ref-set project-member-records (remove #(= (:id (.project %)) proj-id) @project-member-records))))

Teraz chcę usunąć element z project-member-records. Na przykład chcę usunąć element według identyfikatora projektu i identyfikatora członka, np. Znajdując rekord w find-project-member-record funkcjonować. Lub (i) chcę usunąć przedmiot, niż mam znaleziony przez niego rekord project-member-records, coś jak (remove (find-project-member-record 1 1) project-records) ;pseudo codeAle nie wiem, jak to zrobić.

Odpowiedzi:

1 dla odpowiedzi № 1

Za pomocą remove jest poprawny, ale find-project-member-record zwraca sekwencję. Próbować

(defn remove-project-member-record [proj-id member-id]
(let [it (first (find-project-member-record proj-id member-id))]
(dosync
(ref-set project-member-records
(remove #(= % it) @project-member-records)))))

Gdyby find-project-member-record zawsze zwraca pustą sekwencję lub sekwencję z jednym elementem, może mieć sens, aby zamiast tego zwracał sam element lub nil. (np. zadzwoń first na wynik filter w find-project-member-record raczej niż w remove-project-member-record i gdziekolwiek).

Oto, w jaki sposób możesz go ułożyć, jeśli chcesz, aby wszystko zostało zapakowane dosync transakcja:

(defn remove-project-member-record [proj-id member-id]
(dosync
(let [it (first (find-project-member-record proj-id member-id))]
(ref-set project-member-records
(remove #(= % it) @project-member-records)))))