6 let SomeTRUE = Some(TRUE)
7 let FALSE = Bool(false)
8 let SomeFALSE = Some(FALSE)
10 let SomeNIL = Some(NIL)
13 let makeVector seg
= Vector(NIL, seg
)
14 let makeList lst
= List(NIL, lst
)
15 let makeMap map
= Map(NIL, map
)
17 let EmptyLIST = [] |> makeList
18 let EmptyVECTOR = System.ArraySegment([| |]) |> makeVector
19 let EmptyMAP = Map.empty
|> makeMap
21 let ofArray arr
= System.ArraySegment(arr
) |> makeVector
23 let toArray = function
24 | List(_
, lst
) -> Array.ofList
lst
25 | Vector(_
, seg
) -> Array.sub seg
.Array seg
.Offset seg.Count
29 | List(_
, lst) -> List.length lst
30 | Vector(_
, seg) -> seg.Count
31 | Map(_
, m
) -> m
.Count
34 (* Active Patterns to help with pattern matching nodes *)
35 let inline (|Elements|_|) num
node =
36 let rec accumList
acc idx
lst =
37 let len = Array.length acc
39 | [] when idx
= len -> Some(Elements acc)
40 | h::t
when idx
< len ->
42 accumList
acc (idx
+ 1) t
45 | List(_, lst) -> accumList
(Array.zeroCreate
num) 0 lst
46 | Vector(_, seg) when seg.Count = num -> Some(toArray node)
49 let inline (|Cons|_|) node =
51 | List(_, h::t
) -> Some(Cons(h, makeList t))
52 | Vector(_, seg) when seg.Count > 0 ->
53 let h = seg.Array.[seg.Offset]
54 let t = System.ArraySegment(seg.Array, seg.Offset + 1, seg.Count - 1)
59 let inline (|Empty|_|) node =
61 | List(_, []) -> Some(Empty)
62 | Vector(_, seg) when seg.Count = 0 -> Some(Empty)
65 let inline (|Pair|_|) node =
67 | List(_, a
::b
::t) -> Some(a
, b
, makeList t)
69 | List(_, _) -> raise
<| Error.expectedEvenNodeCount
()
73 | 1 -> raise
<| Error.expectedEvenNodeCount
()
75 let a = seg.Array.[seg.Offset]
76 let b = seg.Array.[seg.Offset + 1]
77 let t = System.ArraySegment(seg.Array, seg.Offset + 2, seg.Count - 2)
82 let inline (|Seq|_|) node =
84 | List(_, lst) -> Some(Seq.ofList
lst)
85 | Vector(_, seg) -> Some(seg :> Node seq)