type ('a, 'b) lens = {
get : 'a -> 'b;
set : 'b -> 'a -> 'a;
}
type ('a, 'b) prism = {
preview : 'a -> 'b option;
review : 'b -> 'a;
}
val option : ('a option, 'a) prism
val compose : ('a, 'b) lens -> ('b, 'c) lens -> ('a, 'c) lens
val compose_prism : ('a, 'b) lens -> ('b, 'c) prism -> ('a, 'c) lens
val fst : ('a * 'b, 'a) lens
val snd : ('a * 'b, 'b) lens
val hd : ('a list, 'a) prism
val nth : int -> ('a list, 'a) prism
val get : ('a, 'b) lens -> 'c -> 'd
val set : ('a, 'b) lens -> 'c -> 'd -> 'e