Source file zipper_def.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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253

type ('a,'b) pair = { backbone:'a; user:'b }

type a = Paths.Expr.t * (Loc.t * Deps.Edge.t)
module Arg = Module.Arg


module type tree = sig
  type path
  type module_expr
  type access
  type minor
  type minors
  type module_type
  type with_constraints
  type m2l
  type expr
  type bind_rec
  type ext
  type path_expr
  type path_expr_args
  type opens
end

type state_diff = Zipper_skeleton.state_diff

module type fold = sig
  include tree
  val path : Zipper_skeleton.query -> path
  val abstract : module_expr
  val alias : path -> module_type

  val access_add :
    path_expr -> Uloc.t -> Deps.Edge.t -> access -> access
  val access_init : access
  val access : access -> minor
  val external_def: string list -> minor
  val pack: module_expr -> minor
  val minor_ext: loc:Uloc.t -> string -> ext -> minor
  val local_open: module_expr -> minors -> minor
  val local_bind: Name.t option -> module_expr -> minors -> minor
  val empty_minors: minors
  val add_minor: minor -> minors -> minors

  val apply : Uloc.t -> module_expr -> module_expr -> module_expr

  val bind : Name.t option -> module_expr -> expr
  val bind_alias: Name.t option -> Paths.S.t -> expr
  val bind_rec : bind_rec -> expr
  val bind_rec_add :
    Name.t option -> module_expr -> bind_rec -> bind_rec
  val bind_rec_init : bind_rec
  val bind_sig : Name.t option -> module_type -> expr

  val expr_ext : string -> ext -> expr
  val expr_include : loc:Uloc.t -> module_expr -> expr
  val expr_open : loc:Uloc.t -> module_expr -> expr
  val ext_module : m2l -> ext
  val ext_val : minors -> ext

  val m2l_add : Uloc.t -> expr -> m2l -> m2l
  val m2l_init : m2l
  val m2l: m2l  -> m2l

  val me_constraint : module_expr -> module_type -> module_expr
  val me_ext : loc:Uloc.t -> string -> ext -> module_expr
  val me_fun :
    module_type Arg.t option -> module_expr -> module_expr
  val me_ident : path -> module_expr
  val me_val : minors -> module_expr
  val me_proj: module_expr -> Paths.S.t -> path -> module_expr

  val minor : minors -> expr


  val mt_ext : loc:Uloc.t -> string -> ext -> module_type
  val mt_fun :
    module_type Arg.t option -> module_type -> module_type
  val mt_ident : path_expr -> module_type
  val mt_of : module_expr -> module_type
  val mt_sig : m2l -> module_type
  val mt_with : module_type -> with_constraints -> module_type

  val with_init: with_constraints
  val with_type: minors -> with_constraints -> with_constraints
  val with_lhs: path -> with_constraints -> with_constraints
  val with_module:
    delete:bool -> lhs:Paths.S.t -> rhs:module_expr -> with_constraints -> with_constraints
  val with_module_type:
    delete:bool -> lhs:Paths.S.t -> rhs:module_type -> with_constraints -> with_constraints

  val open_add :
    path -> opens -> opens
  val open_init : opens
  val open_me : opens -> module_expr -> module_expr

  val path_expr_pure : path -> path_expr
  val path_expr_app : path_expr -> path_expr -> path_expr
  val path_expr_proj: path_expr -> Paths.S.t -> path -> path_expr

  val sig_abstract : module_type
  val sig_include : loc:Uloc.t -> module_type -> expr
  val str : m2l -> module_expr
  val unpacked : module_expr

end

module type s = sig
  module T : tree
  module Abbrevs: sig
    type path = (Zipper_skeleton.path, T.path) pair
    type module_expr = (Zipper_skeleton.module_like, T.module_expr) pair
    type access = T.access
    type minor = T.minor
    type minors = T.minors
    type module_type = (Zipper_skeleton.module_like, T.module_type) pair
    type with_constraints = (Zipper_skeleton.module_like, T.with_constraints) pair
    type m2l = (Zipper_skeleton.m2l, T.m2l) pair
    type bind_rec = (state_diff, T.bind_rec) pair
    type path_expr_t = (Zipper_skeleton.module_like, T.path_expr) pair
    type opens = T.opens
    type path_in_context = Zipper_skeleton.path_in_context
  end
  open Abbrevs


  type waccess = W of access [@@unboxed]

  type 'focus expr =
    | Open: M2l.module_expr expr
    | Include:  M2l.module_expr expr
    | SigInclude:  M2l.module_type expr
    | Bind: Name.t option ->  M2l.module_expr expr
    | Bind_sig: Name.t option -> M2l.module_type expr
    | Bind_rec_sig:
        {
          diff: state_diff;
          left: (Name.t option * T.module_type * M2l.module_expr) list;
          name: Name.t option;
          expr: M2l.module_expr;
          right: M2l.module_expr M2l.bind list
        } -> M2l.module_type expr
    | Bind_rec:
        {
          left: bind_rec;
          name:Name.t option;
          mt: T.module_type;
          right: (Name.t option * T.module_type * M2l.module_expr) list;
        } -> M2l.module_expr expr
    | Minors: M2l.minor list expr
    | Extension_node: string ->  M2l.extension_core expr

  type 'focus minor =
    | Access : waccess minor
    | Pack : M2l.module_expr minor
    | Extension_node : Name.t -> M2l.extension_core minor

    | Local_open_left : state_diff * Loc.t * M2l.minor list -> M2l.module_expr minor
    | Local_open_right: state_diff * module_expr -> M2l.minor list minor

    | Local_bind_left: state_diff * Name.t option * M2l.minor list -> M2l.module_expr minor
    | Local_bind_right: state_diff * Name.t option * module_expr -> M2l.minor list minor

  type acc =
    {left: access;
     right:a list
    }

  type  'f path_expr =
    | Simple: path_in_context path_expr
    | App_f: Paths.Expr.t * (Module.level * Deps.Edge.t * Paths.S.t) option -> Paths.Expr.t path_expr
    | App_x: path_expr_t * (Module.level * Deps.Edge.t * Paths.S.t) option -> Paths.Expr.t path_expr
    | Proj: path_expr_t * Paths.S.t -> path_in_context path_expr

  type 'focus me =
    | Ident: path_in_context me
    | Apply_left: M2l.module_expr -> M2l.module_expr me
    | Apply_right: module_expr -> M2l.module_expr me
    | Proj_left: Paths.Simple.t -> M2l.module_expr me
    | Proj_right: module_expr * Paths.S.t -> path_in_context me
    | Fun_left: {name:Name.t option; diff:state_diff; body:M2l.module_expr} -> M2l.module_type me
    | Fun_right:
        (module_type Arg.t * state_diff ) option
        -> M2l.module_expr me
    | Constraint_left: M2l.module_type -> M2l.module_expr me
    | Constraint_right: module_expr -> M2l.module_type me
    | Str: M2l.m2l me
    | Val: M2l.minor list me
    | Extension_node: string -> M2l.extension_core me
    | Open_me_left:
        { left: opens;
          right:Paths.S.t Loc.ext list;
          diff:state_diff;
          loc: Loc.t;
          expr:M2l.module_expr
        } -> path_in_context me
    | Open_me_right:
        {opens:opens; state:state_diff} -> M2l.module_expr me

  type 'focus mt =
    | Alias: path_in_context mt
    | Ident: Paths.Expr.t mt
    | Sig: M2l.m2l mt
    | Fun_left: {name:Name.t option; diff:state_diff; body:M2l.module_type} -> M2l.module_type mt
    | Fun_right: (module_type Arg.t * state_diff) option
        -> M2l.module_type mt
    | With_constraints: {
        original_body:module_type;
        right:M2l.with_constraint list
      }
        -> M2l.with_constraint mt
    | With_body: M2l.with_constraint list -> M2l.module_type mt
    | Of: M2l.module_expr mt
    | Extension_node: string -> M2l.extension_core mt

  type 'focus with_constraint =
    | With_lhs: {body:with_constraints; delete:bool; lhs:Paths.S.t; rhs: M2l.with_rhs } ->
        path_in_context with_constraint
    | With_type: with_constraints ->  M2l.minor list with_constraint
    | With_module: {body:with_constraints; lhs:Paths.S.t; delete:bool} -> path_in_context with_constraint
    | With_module_type: {body:with_constraints; lhs:Paths.S.t; delete:bool} -> M2l.module_type with_constraint



  type 'focus ext =
    | Mod: M2l.m2l ext
    | Val: M2l.minor list ext

  type ('elt,'from) elt =
    | M2l: {left:m2l;
            loc:Uloc.t;
            state:state_diff;
            right:M2l.m2l}
        -> (M2l.expression, M2l.m2l) elt
    | Expr: 'elt expr -> ('elt,M2l.expression) elt
    | Minor: 'elt minor -> ('elt, M2l.minor) elt
    | Minors:
        { left: minors; right: M2l.minor list } ->
        (M2l.minor,M2l.minor list) elt
    | Me: 'elt me -> ('elt, M2l.module_expr) elt
    | Mt: 'elt mt -> ('elt, M2l.module_type) elt
    | With_constraint: 'elt with_constraint -> ('elt, M2l.with_constraint) elt
    | Access: acc -> (Paths.Expr.t, waccess) elt
    | Ext: 'elt ext ->  ('elt, M2l.extension_core) elt
    | Path_expr: 'elt path_expr -> ('elt, Paths.Expr.t) elt

  type 'f t =
    | []: M2l.m2l t
    | (::): ('focus,'from) elt * 'from t -> 'focus t

  type 'result zipper = { path: 'result t; focus: 'result }

end