-
Notifications
You must be signed in to change notification settings - Fork 7
/
option.llrl
120 lines (100 loc) · 3.24 KB
/
option.llrl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
(no-implicit-std)
(import "builtin" Option some none)
(import "std/prelude/stage-1" _)
(import "std/ref" Ref ref _.Ref)
(import "std/iterator" Iterate iterate RevIterate iterator/empty iterator/only)
(export Option some none try? option/_ _.Option)
(function (option/unwrap alt x) {(forall A) (-> A (Option A) A)}
(match x
[(some (let x)) x]
[none alt]))
(function (option/unwrap* altf x) {(forall A) (-> (-> A) (Option A) A)}
(match x
[(some (let x)) x]
[none (altf)]))
(function (option/force x) {(forall A) (-> (Option A) A)}
(match x
[(some (let x)) x]
[none (assert #f "option/force")]))
(function (option/map f x) {(forall A B) (-> (-> A B) (Option A) (Option B))}
(match x
[(some (let x)) (some (f x))]
[none none]))
(function (option/filter f x) {(forall A) (-> (-> A Bool) (Option A) (Option A))}
(match x
[(some (let x)) (if (f x) (some x) none)]
[none none]))
(function (option/then f x) {(forall A B) (-> (-> A (Option B)) (Option A) (Option B))}
(match x
[(some (let x)) (f x)]
[none none]))
(function (option/flatten x) {(forall A B) (-> (Option (Option A)) (Option A))}
(match x
[(some (some (let x))) (some x)]
[_ none]))
(function (option/take x) {(forall A) (-> (Ref (Option A)) (Option A))}
(match ~x
[(some (let a)) (set! x none) (some a)]
[none none]))
(macro (option/and s)
(s/match s
[(_ ,option ,@options)
(ok (expand-and option options))]
[_
(err "Expected (option/and option option-2 ...)")]))
(function (expand-and r rs)
(match rs
[(s:cons (let r2) (let rs))
`(match ,r
[(,\some _) ,(expand-and r2 rs)]
[,\none ,\none])]
[_
r]))
(macro (option/or s)
(s/match s
[(_ ,option ,@options)
(ok (expand-or option options))]
[_
(err "Expected (option/or option option-2 ...)")]))
(function (expand-or r rs)
(match rs
[(s:cons (let r2) (let rs))
`(match ,r
[(,\some (let x)) (,\some x)]
[,\none ,(expand-or r2 rs)])]
[_
r]))
(instance DeepCopy.Option (forall A) (DeepCopy (Option A)) (where (DeepCopy A))
(function (deep-copy a)
(match a
[(some (let x)) (some (deep-copy x))]
[_ a])))
(instance Default.Option (forall A) (Default (Option A))
(transparent-function default none))
(instance DebugDisplay.Option (forall A) (DebugDisplay (Option A)) (where (DebugDisplay A))
(function (debug-display! w a)
(match a
[(some (let x))
(display-all! w "(some " (debug x) ")")]
[none
(display-all! w "none")])))
(instance Eq.Option (forall A) (Eq (Option A)) (where (Eq A))
(function (eq? a b)
(match (: a b)
[(: (some (let a)) (some (let b))) (eq? a b)]
[(: none none) #t]
[_ #f])))
(instance Ord.Option (forall A) (Ord (Option A)) (where (Ord A))
(function (compare a b)
(match (: a b)
[(: (some (let a)) (some (let b))) (compare a b)]
[(: (some _) none) ordering:greater]
[(: none (some _)) ordering:less]
[(: none none) ordering:equal])))
(instance Iterate.Option (Iterate Option)
(function (iterate t)
(match t
[(some (let x)) (iterator/only x)]
[none iterator/empty])))
(instance RevIterate.Option (RevIterate Option)
(function (rev-iterate t) (iterate t)))