silo:std.result
Source src/silo:std.result
1
2
3
4
5
6:use
7 :open core Bool Never Option None Some Result Ok Err Str
8 :open traits Eq
9 :open effects.panic panic
10:end
11
12
13
14
15
16:trait(pub) Res
17
18 .is-ok ( (Result val err) -> Bool )
19
20 .is-err ( (Result val err) -> Bool )
21
22 .map ( [a -> b] (Result a err) -> (Result b err) )
23
24 .map-err ( [e1 -> e2] (Result val e1) -> (Result val e2) )
25
26 .and-then ( [a -> (Result b err)] (Result a err) -> (Result b err) )
27
28 .or-else ( [e1 -> (Result val e2)] (Result val e1) -> (Result val e2) )
29
30 .unwrap ( (Result val err) -> val ) +Panic
31
32 .unwrap-err ( (Result val err) -> err ) +Panic
33
34 .expect ( (Result a e) Str -> a ) +Panic
35
36 .expect-err ( (Result a e) Str -> e ) +Panic
37
38 .unwrap-or ( val (Result val err) -> val )
39
40 .unwrap-or-else ( [err -> val] (Result val err) -> val )
41
42 .into-ok ( (Result a Never) -> a )
43
44 .into-err ( (Result Never e) -> e )
45
46 .ok ( (Result val err) -> (Option val) )
47
48 .err ( (Result val err) -> (Option err) )
49
50 .flatten ( (Result (Result val err) err) -> (Result val err) )
51 .map-or ( (Result a e) b [a -> b] -> b )
52 .map-or-else ( (Result a e) [e -> b] [a -> b] -> b )
53 .and ( (Result a e) (Result b e) -> (Result b e) )
54 .or ( (Result a e) (Result a f) -> (Result a f) )
55 .is-ok-and ( (Result a e) [a -> Bool] -> Bool )
56 .is-err-and ( (Result a e) [e -> Bool] -> Bool )
57 .transpose ( (Result (Option a) e) -> (Option (Result a e)) )
58
59 .inspect ( (Result a e) [a -> ] -> (Result a e) ) +eff
60
61 .inspect-err ( (Result a e) [e -> ] -> (Result a e) ) +eff
62
63 .contains ( (Result a e) a -> Bool ) { (Eq a a) }
64
65 .contains-err ( (Result a e) e -> Bool ) { (Eq e e) }
66:end
67
68:impl Res (Result val err)
69 .is-ok ( (Result val err) -> Bool )
70 :match | Ok _ => true | Err _ => false :end ;
71
72 .is-err ( (Result val err) -> Bool )
73 :match | Ok _ => false | Err _ => true :end ;
74
75 .map ( [a -> b] (Result a err) -> (Result b err) )
76 :match
77 | Ok x => x swap .call Ok
78 | Err e => drop e Err
79 :end ;
80
81 .map-err ( [e1 -> e2] (Result val e1) -> (Result val e2) )
82 :match
83 | Ok x => drop x Ok
84 | Err e => e swap .call Err
85 :end ;
86
87 .and-then ( [a -> (Result b err)] (Result a err) -> (Result b err) )
88 :match
89 | Ok x => x swap .call
90 | Err e => drop e Err
91 :end ;
92
93 .or-else ( [e1 -> (Result val e2)] (Result val e1) -> (Result val e2) )
94 :match
95 | Ok x => drop x Ok
96 | Err e => e swap .call
97 :end ;
98
99
100 .unwrap ( (Result val err) -> val ) +Panic
101 :match
102 | Ok x => x
103 | Err _ => "unwrap called on Err" panic
104 :end ;
105
106
107 .unwrap-err ( (Result val err) -> err ) +Panic
108 :match
109 | Ok _ => "unwrap-err called on Ok" panic
110 | Err e => e
111 :end ;
112
113
114 .expect ( (Result a e) Str -> a ) +Panic
115 pop-> msg
116 :match
117 | Ok x => x
118 | Err _ => msg panic
119 :end ;
120
121
122 .expect-err ( (Result a e) Str -> e ) +Panic
123 pop-> msg
124 :match
125 | Ok _ => msg panic
126 | Err e => e
127 :end ;
128
129 .unwrap-or ( val (Result val err) -> val )
130 :match
131 | Ok x => drop x
132 | Err _ =>
133 :end ;
134
135 .unwrap-or-else ( [err -> val] (Result val err) -> val )
136 :match
137 | Ok x => drop x
138 | Err e => e swap .call
139 :end ;
140
141
142 .into-ok ( (Result a Never) -> a )
143 :match | Ok x => x :end ;
144
145
146 .into-err ( (Result Never e) -> e )
147 :match | Err e => e :end ;
148
149 .ok ( (Result val err) -> (Option val) )
150 :match
151 | Ok x => x Some
152 | Err _ => None
153 :end ;
154
155 .err ( (Result val err) -> (Option err) )
156 :match
157 | Ok _ => None
158 | Err e => e Some
159 :end ;
160
161 .flatten ( (Result (Result val err) err) -> (Result val err) )
162 :match
163 | Ok inner => inner
164 | Err e => e Err
165 :end ;
166
167 .map-or ( (Result a e) b [a -> b] -> b )
168 pop-> f pop-> default
169 :match
170 | Ok x => x f .call
171 | Err _ => default
172 :end ;
173
174 .map-or-else ( (Result a e) [e -> b] [a -> b] -> b )
175 pop-> f pop-> default-fn
176 :match
177 | Ok x => x f .call
178 | Err e => e default-fn .call
179 :end ;
180
181 .and ( (Result a e) (Result b e) -> (Result b e) )
182 swap :match
183 | Ok _ =>
184 | Err e => drop e Err
185 :end ;
186
187 .or ( (Result a e) (Result a f) -> (Result a f) )
188 swap :match
189 | Ok x => drop x Ok
190 | Err _ =>
191 :end ;
192
193 .is-ok-and ( (Result a e) [a -> Bool] -> Bool )
194 pop-> pred
195 :match
196 | Ok x => x pred .call
197 | Err _ => false
198 :end ;
199
200 .is-err-and ( (Result a e) [e -> Bool] -> Bool )
201 pop-> pred
202 :match
203 | Ok _ => false
204 | Err e => e pred .call
205 :end ;
206
207 .transpose ( (Result (Option a) e) -> (Option (Result a e)) )
208 :match
209 | Ok inner => inner :match
210 | None => None
211 | Some x => x Ok Some
212 :end
213 | Err e => e Err Some
214 :end ;
215
216
217 .inspect ( (Result a e) [a -> ] -> (Result a e) ) +eff
218 pop-> f
219 :match
220 | Ok x => x f .call x Ok
221 | Err e => e Err
222 :end ;
223
224
225 .inspect-err ( (Result a e) [e -> ] -> (Result a e) ) +eff
226 pop-> f
227 :match
228 | Ok x => x Ok
229 | Err e => e f .call e Err
230 :end ;
231
232
233 .contains ( (Result a e) a -> Bool ) { (Eq a a) }
234 pop-> val
235 :match
236 | Ok x => x val .=
237 | Err _ => false
238 :end ;
239
240
241 .contains-err ( (Result a e) e -> Bool ) { (Eq e e) }
242 pop-> val
243 :match
244 | Ok _ => false
245 | Err e => e val .=
246 :end ;
247:end