Einige verschachtelte Fallklassen mit List
-Feldern definiert:
Und ein Beispiel workspace
:
Nun möchte ich eine solche Methode schreiben, die ein neues version
zu einem doc
hinzufügt:
Ich werde wie folgt verwendet:
%Vor% Ich bin mir nicht sicher, wie ich es elegant umsetzen soll. Ich habe versucht mit Monokel , aber es bietet nicht filter
oder find
. Meine peinliche Lösung ist:
Gibt es eine bessere Lösung? (Kann beliebige Bibliotheken verwenden, nicht nur monocle
)
Wir können addNewVersion
mit der Optik ziemlich gut implementieren, aber es gibt ein Problem:
Dies funktioniert, aber Sie haben vielleicht bemerkt, dass select
Prism
nicht von Monocle bereitgestellt wird . Dies liegt daran, dass select
die Traversal
-Gesetze nicht erfüllt, die für alle t
, t.modify(f) compose t.modify(g) == t.modify(f compose g)
angeben.
Ein Gegenbeispiel ist:
%Vor% Die Verwendung von select
in workspaceToVersions
ist jedoch vollständig gültig, da wir nach einem anderen Feld filtern, das wir modifizieren. Daher können wir das Prädikat nicht ungültig machen.
Sie können Monocles Index
-Typ verwenden, um Ihre Lösung sauberer und allgemeiner zu machen.
Das sagt: Ich weiß, wie man ein Projekt in einem Arbeitsbereich mit einer Zeichenfolge (der Name) und einem Dokument in einem Projekt nach einer Zeichenfolge (dem Pfad) sucht. Du könntest auch Index
Instanzen wie Index[List[Project], String, Project]
setzen, aber da du List
nicht besitzt, ist das wohl nicht ideal.
Als nächstes können Sie ein Optional
definieren, das die beiden Suchvorgänge kombiniert:
Und dann deine Methode:
%Vor%Und du bist fertig. Dies ist nicht wirklich prägnanter als Ihre Implementierung, aber es besteht aus besser zusammensetzbaren Stücken.
Tags und Links scala lens monocle-scala