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
type 'a t =
| Data of 'a
| EndOfSignal
let pure (value : 'a) : 'a t = Data value
let empty () : 'a t = EndOfSignal
let default default_value = function
| Data value -> value
| EndOfSignal -> default_value
let satisfies f = function
| Data value -> f value
| EndOfSignal -> false
let map (f : 'a -> 'b) (ma : 'a t) : 'b t =
match ma with
| Data value -> Data (f value)
| EndOfSignal -> EndOfSignal
let filter (f : 'a -> bool) (ma : 'a t) : 'a t =
match ma with
| Data value when f value -> Data value
| Data _ | EndOfSignal -> EndOfSignal
let fold (f : 'a -> 'b -> 'a) (init : 'a) (ma : 'b t) : 'a =
match ma with
| Data value -> f init value
| EndOfSignal -> init
let from_option = function
| Some value -> Data value
| None -> EndOfSignal
let to_option = function
| Data value -> Some value
| EndOfSignal -> None