Lens.Lens
Set Primitive Projections.
Record Lens (a b c d : Type) : Type :=
{ view : a -> c
; over : (c -> d) -> a -> b
}.
Arguments over {_ _ _ _} _ _ _.
Arguments view {_ _ _ _} _ _.
Definition lens_compose {a b c d e f : Type}
(l1 : Lens a b c d) (l2 : Lens c d e f)
: Lens a b e f :=
{| view := fun x : a => view l2 (view l1 x)
; over := fun f0 : e -> f => over l1 (over l2 f0) |}.
Section ops.
Context {a b c d : Type} (l : Lens a b c d).
Definition set (new : d) : a -> b :=
l.(over) (fun _ => new).
End ops.
Module LensNotations.
Declare Scope lens_scope.
Delimit Scope lens_scope with lens.
Bind Scope lens_scope with Lens.
Notation "X -l> Y" := (Lens X X Y Y)
(at level 99, Y at level 200, right associativity) : type_scope.
#[deprecated(since="20240514",note="use &: instead")]
Notation "a & b" := (b a) (at level 50, only parsing, left associativity) : lens_scope.
Notation "a &: b" := (b a) (at level 50, only parsing, left associativity) : lens_scope.
Notation "a %= f" := (Lens.over a f) (at level 49, left associativity) : lens_scope.
Notation "a .= b" := (Lens.set a b) (at level 49, left associativity) : lens_scope.
Notation "a .^ f" := (Lens.view f a) (at level 45, left associativity) : lens_scope.
(* level 19 to be compatible with Iris .@ *)
Notation "a .@ b" := (lens_compose a b) (at level 19, left associativity) : lens_scope.
End LensNotations.
Record Lens (a b c d : Type) : Type :=
{ view : a -> c
; over : (c -> d) -> a -> b
}.
Arguments over {_ _ _ _} _ _ _.
Arguments view {_ _ _ _} _ _.
Definition lens_compose {a b c d e f : Type}
(l1 : Lens a b c d) (l2 : Lens c d e f)
: Lens a b e f :=
{| view := fun x : a => view l2 (view l1 x)
; over := fun f0 : e -> f => over l1 (over l2 f0) |}.
Section ops.
Context {a b c d : Type} (l : Lens a b c d).
Definition set (new : d) : a -> b :=
l.(over) (fun _ => new).
End ops.
Module LensNotations.
Declare Scope lens_scope.
Delimit Scope lens_scope with lens.
Bind Scope lens_scope with Lens.
Notation "X -l> Y" := (Lens X X Y Y)
(at level 99, Y at level 200, right associativity) : type_scope.
#[deprecated(since="20240514",note="use &: instead")]
Notation "a & b" := (b a) (at level 50, only parsing, left associativity) : lens_scope.
Notation "a &: b" := (b a) (at level 50, only parsing, left associativity) : lens_scope.
Notation "a %= f" := (Lens.over a f) (at level 49, left associativity) : lens_scope.
Notation "a .= b" := (Lens.set a b) (at level 49, left associativity) : lens_scope.
Notation "a .^ f" := (Lens.view f a) (at level 45, left associativity) : lens_scope.
(* level 19 to be compatible with Iris .@ *)
Notation "a .@ b" := (lens_compose a b) (at level 19, left associativity) : lens_scope.
End LensNotations.