blob: 16de4588c9e6c4aaf0220ddcda0a13a715bad02d (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
/-!
# Lenses
A `Lens` bundles a getter and an (updating) setter which can be used to elegantly describe a field of a structure.
-/
namespace Wayland
/-- A lens that points into a substructure of type `I` within a structure of type `O`. -/
structure Lens (O I : Type) where
/-- Get the substructure from the outer structure. -/
get : O → I
/-- Update the outer structure to contain the updated substructure. -/
set : I → O → O
/-- Helper for writing a `Lens` constructor for a named field of a structure. -/
macro "mk_lens " field:ident : term => do
let lvalNode := Lean.mkNode `Lean.Parser.Term.structInstLVal #[field.raw, Lean.mkNullNode #[]]
let lval : Lean.TSyntax `Lean.Parser.Term.structInstLVal := ⟨lvalNode⟩
`({ get := fun x => x.$field, set := fun i x => { x with $lval := i } })
end Wayland
|