Skip to content

Commit 4f41a7f

Browse files
committed
feat: Add basic lens functionality to standard library
1 parent fcd3a29 commit 4f41a7f

File tree

3 files changed

+73
-0
lines changed

3 files changed

+73
-0
lines changed

std/functor/const.glu

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
let { Functor } = import! std.functor
2+
3+
type Const s a = { value : s }
4+
5+
#[implicit]
6+
let functor : forall s . Functor (Const s) = {
7+
map = \f -> \c -> { value = c.value },
8+
}
9+
10+
let app : s -> Const s a = \value -> { value }
11+
12+
let run : Const s a -> s = \c -> c.value
13+
14+
{ Const, functor, app, run }

std/functor/identity.glu

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
let { Functor } = import! std.functor
2+
3+
type Identity a = { value : a }
4+
5+
#[implicit]
6+
let functor : Functor Identity = {
7+
map = \f -> \i -> { value = f i.value }
8+
}
9+
10+
let app : a -> Identity a = \value -> { value }
11+
12+
let run : Identity a -> a = \i -> i.value
13+
14+
{Identity, functor, app, run}

std/lens.glu

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
let { Functor, map } = import! std.functor
2+
let const @ { Const, ? } = import! std.functor.const
3+
let identity @ { Identity, ? } = import! std.functor.identity
4+
5+
6+
type Lens s t a b = { app : forall f . [Functor f] -> (a -> f b) -> s -> f t }
7+
8+
9+
type Lens' s a = Lens s s a a
10+
11+
12+
let view lens x : Lens s t a b -> s -> a =
13+
let res = lens.app const.app x
14+
res.value
15+
16+
17+
let over lens f y : Lens s t a b -> (a -> b) -> s -> t =
18+
let res = lens.app (\x -> identity.app (f x)) y
19+
res.value
20+
21+
22+
let set lens x : Lens s t a b -> b -> s -> t = over lens (\_ -> x)
23+
24+
25+
let make view set : (s -> a) -> (b -> s -> t) -> Lens s t a b =
26+
{
27+
app = \k x -> map (\y -> set y x) (k (view x)),
28+
}
29+
30+
31+
#[infix(right, 8)]
32+
let (^) g f : Lens j k s t -> Lens s t a b -> Lens j k a b = {
33+
app = \k -> g.app (f.app k),
34+
}
35+
36+
37+
#[infix(left, 1)]
38+
let (&) x g : a -> (a -> b) -> b = g x
39+
40+
41+
#[infix(right, 9)]
42+
let (^.) x lens : s -> Lens s t a b -> a = view lens x
43+
44+
45+
{ Lens, Lens', view, set, over, make, (^), (&), (^.) }

0 commit comments

Comments
 (0)