open Fieldglass let sample : (string * bool, string) lens' = lens ~view:fst ~set:(fun value (_, other) -> value, other) let () = assert (view sample ("colour", true) = "colour") let () = let source = "colour", true in assert (set sample "grey" source = ("grey", true)); assert (set sample (view sample source) source = source); assert (set sample "blue" (set sample "grey" source) = set sample "blue" source); let calls = ref 0 in assert (over sample ~f:(fun text -> incr calls; text ^ "s") source = ("colours", true)); assert (!calls = 1) let () = let first = (fst, fun value (_, rest) -> value, rest) in let second = (snd, fun value (rest, _) -> rest, value) in let focus = compose first second in assert (view focus ((true, "grey"), false) = "grey"); assert (set focus 9 ((true, "grey"), false) = ((true, 9), false)) let () = assert (set _1 "grey" (1, true) = ("grey", true)); assert (over _2 ~f:string_of_int (false, 9) = (false, "9")); assert (view (compose _1 _2) ((true, "grey"), ()) = "grey")