package refl

  1. Overview
  2. Docs

Source file indexer.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
module Make (T : Map.OrderedType) = struct
  module Map = Map.Make (T)

  type t = {
      count : int;
      map : int Map.t;
    }

  let of_fresh count = { count; map = Map.empty }

  let empty = of_fresh 0

  let count indexer = indexer.count

  let to_map indexer = indexer.map

  let fresh indexer =
    let index = indexer.count in
    index, { indexer with count = succ indexer.count }

  let force_add item indexer =
    let index, indexer = fresh indexer in
    index, { indexer with map = Map.add item index indexer.map }

  let mem item indexer =
    Map.mem item indexer.map

  let find item indexer =
    Map.find item indexer.map

  let find_opt item indexer =
    Map.find_opt item indexer.map

  let add item indexer =
    try find item indexer, indexer
    with Not_found -> force_add item indexer

  let of_list list =
    List.fold_left begin fun indexer x ->
      snd begin match x with
      | None -> fresh indexer
      | Some x -> force_add x indexer
      end
    end empty list

  let union indexer indexer' = {
    count = indexer.count + indexer'.count;
    map =
      Map.map (fun index -> index + indexer.count) indexer'.map |>
      Map.union (fun _ _ _ -> invalid_arg "Indexer.union") indexer.map
  }
end
OCaml

Innovation. Community. Security.