module Colour = struct type t = { red : int; green : int; blue : int } [@@fieldglass generate] end module Legacy = struct type t = { value : string } [@@lens generate] end let () = let colour = Colour.{ red = 3; green = 4; blue = 5 } in assert (Colour.red colour = 3); assert (Colour.green colour = 4); assert (Legacy.value Legacy.{ value = "grey" } = "grey") module Box = struct type 'a t = { contents : 'a } [@@fieldglass generate] end module Mutable = struct type t = { mutable count : int; label : string } [@@fieldglass generate] end let () = let original = Colour.{ red = 3; green = 4; blue = 5 } in assert (Colour.set_red 8 original = Colour.{ red = 8; green = 4; blue = 5 }); assert (Colour.red original = 3); assert (Box.set_contents "grey" Box.{ contents = 9 } = Box.{ contents = "grey" }); let original = Mutable.{ count = 1; label = "grey" } in let changed = Mutable.set_count 2 original in assert (original.Mutable.count = 1 && changed.Mutable.count = 2)