Skip to content

Commit 339eb3a

Browse files
committed
Refactor infix operator
1 parent 09088d6 commit 339eb3a

File tree

1 file changed

+54
-28
lines changed

1 file changed

+54
-28
lines changed

tools/src/prettier_printer.ml

+54-28
Original file line numberDiff line numberDiff line change
@@ -120,12 +120,21 @@ module CodePrinter = struct
120120
|> updateMode false
121121

122122
(** compose two context transforming functions *)
123-
let ( +> ) f g ctx =
123+
let compose_aux f g ctx =
124124
let fCtx = f ctx in
125125
match fCtx.mode with
126126
| ConfirmedMultiline -> fCtx
127127
| _ -> g fCtx
128128

129+
let compose (fs : appendEvents list) ctx =
130+
let rec visit fs =
131+
match fs with
132+
| [] -> id
133+
| [f] -> f
134+
| f :: g :: rest -> visit (compose_aux f g :: rest)
135+
in
136+
visit fs ctx
137+
129138
let sepNln ctx =
130139
{
131140
ctx with
@@ -145,7 +154,7 @@ module CodePrinter = struct
145154
let sepOpenL ctx = write "[" ctx
146155
let sepCloseL ctx = write "]" ctx
147156
let sepEq ctx = write " = " ctx
148-
let wrapInParentheses f = sepOpenT +> f +> sepCloseT
157+
let wrapInParentheses f = compose [sepOpenT; f; sepCloseT]
149158
let indent ctx =
150159
let nextIdent = ctx.current_indent + ctx.indent_size in
151160
{
@@ -163,15 +172,15 @@ module CodePrinter = struct
163172
events = UnindentBy ctx.indent_size :: ctx.events;
164173
}
165174

166-
let indentAndNln f = indent +> sepNln +> f +> unindent
175+
let indentAndNln f = compose [indent; sepNln; f; unindent]
167176

168177
let col (f : 't -> appendEvents) (intertwine : appendEvents) items ctx =
169178
let rec visit items ctx =
170179
match items with
171180
| [] -> ctx
172181
| [item] -> f item ctx
173182
| item :: rest ->
174-
let ctx' = (f item +> intertwine) ctx in
183+
let ctx' = compose [f item; intertwine] ctx in
175184
visit rest ctx'
176185
in
177186
visit items ctx
@@ -203,29 +212,42 @@ module CodePrinter = struct
203212
| List xs -> genList xs
204213

205214
and genApplication (name : string) (argument : oak) : appendEvents =
206-
let short = write name +> sepOpenT +> genOak argument +> sepCloseT in
215+
let short = compose [write name; sepOpenT; genOak argument; sepCloseT] in
207216
let long =
208-
write name +> sepOpenT
209-
+> (match argument with
210-
| List _ | Record _ -> genOak argument
211-
| _ -> indentAndNln (genOak argument) +> sepNln)
212-
+> sepCloseT
217+
compose
218+
[
219+
write name;
220+
sepOpenT;
221+
(match argument with
222+
| List _ | Record _ -> genOak argument
223+
| _ -> compose [indentAndNln (genOak argument); sepNln]);
224+
sepCloseT;
225+
]
213226
in
214227
expressionFitsOnRestOfLine short long
215228

216229
and genRecord (recordFields : namedField list) : appendEvents =
217230
let short =
218231
match recordFields with
219-
| [] -> sepOpenR +> sepCloseR
232+
| [] -> compose [sepOpenR; sepCloseR]
220233
| fields ->
221-
sepOpenR +> sepSpace
222-
+> col genNamedField sepSemi fields
223-
+> sepSpace +> sepCloseR
234+
compose
235+
[
236+
sepOpenR;
237+
sepSpace;
238+
col genNamedField sepSemi fields;
239+
sepSpace;
240+
sepCloseR;
241+
]
224242
in
225243
let long =
226-
sepOpenR
227-
+> indentAndNln (col genNamedField sepNln recordFields)
228-
+> sepNln +> sepCloseR
244+
compose
245+
[
246+
sepOpenR;
247+
indentAndNln (col genNamedField sepNln recordFields);
248+
sepNln;
249+
sepCloseR;
250+
]
229251
in
230252
expressionFitsOnRestOfLine short long
231253

@@ -239,16 +261,19 @@ module CodePrinter = struct
239261
and genNamedField (field : namedField) : appendEvents =
240262
let genValue =
241263
match field.value with
242-
| Tuple _ -> sepOpenT +> genOak field.value +> sepCloseT
264+
| Tuple _ -> compose [sepOpenT; genOak field.value; sepCloseT]
243265
| _ -> genOak field.value
244266
in
245-
let short = write (field.name) +> sepEq +> genValue in
267+
let short = compose [write field.name; sepEq; genValue] in
246268
let long =
247-
write (field.name) +> sepEq
248-
+>
249-
match field.value with
250-
| List _ | Record _ -> genOak field.value
251-
| _ -> indentAndNln genValue
269+
compose
270+
[
271+
write field.name;
272+
sepEq;
273+
(match field.value with
274+
| List _ | Record _ -> genOak field.value
275+
| _ -> indentAndNln genValue);
276+
]
252277
in
253278
expressionFitsOnRestOfLine short long
254279

@@ -259,13 +284,14 @@ module CodePrinter = struct
259284
in
260285
let short =
261286
match items with
262-
| [] -> sepOpenL +> sepCloseL
287+
| [] -> compose [sepOpenL; sepCloseL]
263288
| _ ->
264-
sepOpenL +> sepSpace +> col genItem sepSemi items +> sepSpace
265-
+> sepCloseL
289+
compose
290+
[sepOpenL; sepSpace; col genItem sepSemi items; sepSpace; sepCloseL]
266291
in
267292
let long =
268-
sepOpenL +> indentAndNln (col genItem sepNln items) +> sepNln +> sepCloseL
293+
compose
294+
[sepOpenL; indentAndNln (col genItem sepNln items); sepNln; sepCloseL]
269295
in
270296
expressionFitsOnRestOfLine short long
271297
end

0 commit comments

Comments
 (0)