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 (f : Unit -> Option<T>) = case self of
18           Some x -> Some x
19           None -> f ()
20   
21       def to_result<E> (e : E) = case self of
22           Some x -> Result/Ok x
23           None -> Result/Error e
24   
25       def map<U> (f : T -> U) = case self of
26           None -> None
27           Some x -> f x |> Some
28   
29       def flat_map<U> (f : T -> Option<U>) = case self of
30           None -> None
31           Some x -> f x
32   
33       def filter (f : T -> bool) = case self of
34           None -> None
35           Some x -> if f x then Some x else None
36   
37   import Option/Some
38                 None
39