package cps_toolbox
Source file Map.ml
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 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118open Functional type ('key, 'value) data = | Peek of 'key | Bind of 'key * 'value type ('key, 'value) map = (('key, 'value) data) AVL.tree let _peek key = Peek key let _bind key value = Bind (key, value) let get_key data = match data with | Peek key -> key | Bind (key, _) -> key let get_value data fail return = match data with | Peek _ -> fail () | Bind (_, value) -> return value let get_value_unsafe data return = match data with | Peek _ -> assert false | Bind (_, value) -> return value let empty = AVL.null let size = AVL.get_count let fold empty_case bind_case binds = AVL.to_list binds |> fun binds1 -> List.fold (fun return -> return empty_case) (fun bind visit_binds return -> match bind with | Peek _ -> assert false | Bind (key, value) -> visit_binds @@ fun result -> return (bind_case key value result)) binds1 identity let map f binds = AVL.map (fun bind -> match bind with | Peek _ -> assert false | Bind (key, value) -> _bind key (f value)) binds let contains key_order key binds fail return = let _bind_order a b = key_order (get_key a) (get_key b) in AVL.is_member _bind_order (_peek key) binds fail return let insert key_order key value binds = let _data_order left right = key_order (get_key left) (get_key right) in AVL.insert _data_order (_bind key value) binds let remove key_order key binds = let _data_order left right = key_order (get_key left) (get_key right) in AVL.remove _data_order (_peek key) binds let lookup order key binds fail return = let open AVL in let open Order in let rec _visit tree = match tree with | Null -> fail () | Node (_, _, data, left, right) -> begin match order key (get_key data) with | EQ -> get_value data fail return | LT -> _visit left | GT -> _visit right end in _visit binds let lookup_unsafe order key binds = let open AVL in let open Order in let rec _visit tree = match tree with | Null -> assert false | Node (_, _, data, left, right) -> match order key (get_key data) with | EQ -> get_value_unsafe data identity | LT -> _visit left | GT -> _visit right in _visit binds let entries binds = fold (fun return -> return []) (fun key value visit_binds return -> visit_binds @@ fun result -> return ((key, value) :: result)) binds identity let keys binds = fold (fun return -> return []) (fun key _value visit_binds return -> visit_binds @@ fun result -> return (key :: result)) binds identity let values binds = fold (fun return -> return []) (fun _key value visit_binds return -> visit_binds @@ fun result -> return (value :: result)) binds identity let from_entries entries = List.map (fun (key, value) -> _bind key value) entries |> fun binds -> AVL.from_list binds