Lens.Lens
(*
* This file is part of the rocq-lens package.
* Copyright (C) 2020-2024 BlueRock Security, Inc.
*
* This library is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or (at
* your option) any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
* for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this library; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USAQ
*)
#[local] 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.
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.
* This file is part of the rocq-lens package.
* Copyright (C) 2020-2024 BlueRock Security, Inc.
*
* This library is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or (at
* your option) any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
* for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this library; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USAQ
*)
#[local] 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.
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.