1    type Option<T> =
2        | None
3        | Some T
4    
5        def is_none = self == None
6    
7        def unwrap_or_fail (message : String) = case self of
8            Some x -> x
9            None -> fail message
10   
11       def unwrap = unwrap_or_fail "value is none"
12   
13       def unwrap_or (value : T) = case self of
14           Some x -> x
15           None -> value
16   
17       def or_else (value : Option<T>) = case self of
18           Some x -> Some x
19           None -> value
20   
21       def or_else (f : Unit -> Option<T>) = case self of
22           Some x -> Some x
23           None -> f ()
24   
25       def to_result<E> (e : E) = case self of
26           Some x -> Result/Ok x
27           None -> Result/Error e
28   
29       def map<U> (f : T -> U) = case self of
30           None -> None
31           Some x -> f x |> Some
32   
33       def flat_map<U> (f : T -> Option<U>) = case self of
34           None -> None
35           Some x -> f x
36   
37       def filter (f : T -> bool) = case self of
38           None -> None
39           Some x -> if f x then Some x else None
40   
41   import Option/Some
42                 None
43