package base_trie

  1. Overview
  2. Docs

Source file iterator.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
open! Base
include Iterator_intf

type ('iter, 'seq, 'elt, 'idx) t =
  (module Impl0 with type t = 'iter and type seq = 'seq and type elt = 'elt)

module type S0 =
  S0 with type ('iter, 'seq, 'elt, 'idx) iterator := ('iter, 'seq, 'elt, 'idx) t

module type S1 =
  S1 with type ('iter, 'seq, 'elt, 'idx) iterator := ('iter, 'seq, 'elt, 'idx) t

let start (type iter seq elt idx) t =
  let (module Iterate) = (t : (iter, seq, elt, idx) t) in
  Iterate.start
;;

let is_finished (type iter seq elt idx) t =
  let (module Iterate) = (t : (iter, seq, elt, idx) t) in
  Iterate.is_finished
;;

let get_exn (type iter seq elt idx) t =
  let (module Iterate) = (t : (iter, seq, elt, idx) t) in
  Iterate.get_exn
;;

let next_exn (type iter seq elt idx) t =
  let (module Iterate) = (t : (iter, seq, elt, idx) t) in
  Iterate.next_exn
;;

module Make1 (Impl : Impl1) = struct
  type iterator_witness

  let iterator : type a. (a Impl.t, a Impl.seq, a Impl.elt, iterator_witness) t =
    (module struct
      include Impl

      type seq = a Impl.seq
      type elt = a Impl.elt
      type t = a Impl.t
    end)
  ;;

  include Impl
end

module Make0 (Impl : Impl0) = struct
  include Make1 (struct
      include Impl

      type _ seq = Impl.seq
      type _ elt = Impl.elt
      type _ t = Impl.t
    end)

  include Impl
end

module Monomorphic (Iterator : S1) (Elt : T) = struct
  include Iterator

  type seq = Elt.t Iterator.seq
  type elt = Elt.t Iterator.elt
  type t = Elt.t Iterator.t
end

module Of_string = Make0 (struct
    type seq = string
    type elt = char
    type t = int

    let start _ = 0
    let is_finished pos string = pos >= String.length string
    let get_exn pos string = string.[pos]
    let next_exn pos _ = pos + 1
  end)

module Of_listable1 (Seq : Listable1) = Make1 (struct
    type 'a seq = 'a Seq.t
    type 'a elt = 'a Seq.elt
    type 'a t = 'a elt list

    let start seq = Seq.to_list seq
    let is_finished list _ = List.is_empty list
    let get_exn list _ = List.hd_exn list
    let next_exn list _ = List.tl_exn list
  end)

module Of_listable0 (Seq : Listable0) = struct
  include Of_listable1 (struct
      include Seq

      type _ t = Seq.t
      type _ elt = Seq.elt
    end)

  type seq = Seq.t
  type elt = Seq.elt
  type t = Seq.elt list
end

module Of_list = Of_listable1 (struct
    include List

    type 'a elt = 'a
  end)