aboutsummaryrefslogtreecommitdiff
path: root/lib/expression/lazier.ml
blob: d8b12d9ef3db5ca26ef8bdaa6d2f97ea9b3d5e8b (plain)
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
open StdLabels

(** Make a module lazy *)
module Make (S : Sym.SYM_EXPR) = struct
  type 'a repr = 'a S.repr Lazy.t
  type 'a obs = 'a S.obs Lazy.t
  type 'a path_repr = 'a S.path_repr

  let empty : unit -> 'a repr = fun () -> lazy (S.empty ())

  let expr : 'a repr -> 'a repr =
   fun expr -> Lazy.map (fun expr -> S.expr expr) expr

  let literal : string -> 'a repr = fun l -> lazy (S.literal l)
  let integer : string -> 'a repr = fun i -> lazy (S.integer i)

  let path : 'b path_repr -> 'b -> 'a repr =
   fun repr path -> lazy (S.path repr path)

  let concat : 'a repr list -> 'a repr =
   fun exprs ->
    lazy
      (let exprs' = List.map ~f:Lazy.force exprs in
       S.concat exprs')

  let window : 'a repr T.window -> 'a repr list -> 'a repr list -> 'a repr =
   fun w group sort ->
    lazy
      (let w' = T.map_window ~f:Lazy.force w
       and group' = List.map ~f:Lazy.force group
       and sort' = List.map ~f:Lazy.force sort in
       S.window w' group' sort')

  let nvl : 'a repr list -> 'a repr =
   fun exprs ->
    lazy
      (let exprs' = List.map ~f:Lazy.force exprs in
       S.nvl exprs')

  let join : string -> 'a repr list -> 'a repr =
   fun sep exprs ->
    lazy
      (let exprs' = List.map ~f:Lazy.force exprs in
       S.join sep exprs')

  let boperator : T.binary_operator -> 'a repr -> 'a repr -> 'a repr =
   fun op e1 e2 ->
    lazy
      (let e1' = Lazy.force e1 and e2' = Lazy.force e2 in
       S.boperator op e1' e2')

  let gequality : T.binary_operator -> 'a repr -> 'a repr list -> 'a repr =
   fun op e exprs ->
    lazy
      (let e' = Lazy.force e and exprs' = List.map ~f:Lazy.force exprs in
       S.gequality op e' exprs')

  let funct : string -> 'a repr list -> 'a repr =
   fun name exprs ->
    lazy
      (let exprs' = List.map ~f:Lazy.force exprs in
       S.funct name exprs')

  let function' : T.funct -> 'a repr list -> 'a repr =
   fun f exprs ->
    lazy
      (let exprs' = List.map ~f:Lazy.force exprs in
       S.function' f exprs')

  let observe : 'a repr -> 'a obs = fun v -> Lazy.map S.observe v
end