@@ -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
271297end
0 commit comments