123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960open!CoreopenExpect_test_helpers_baseopenPatdiff_kernelletpatdiff?location_style?context?keep_wsstring1string2=Patdiff_core.Without_unix.patdiff(* turns off ANSI codes for color *)?location_style~output:Ascii(* without color, cannot produce the "!|" lines that mix add/keep/remove *)~produce_unified_lines:false(* line splitting produces confusing output in ASCII format *)~split_long_lines:false?context?keep_ws~prev:{name="a";text=string1}~next:{name="b";text=string2}();;letpatdiff_s?location_style?context?keep_wssexp1sexp2=patdiff?location_style?context?keep_ws(sexp_to_stringsexp1)(sexp_to_stringsexp2);;letprint_endline_if_non_empty=function|""->()|string->print_endlinestring;;letprint_patdiff?location_style?context?keep_wsstring1string2=print_endline_if_non_empty(patdiff?location_style?context?keep_wsstring1string2);;letprint_patdiff_s?location_style?context?keep_wssexp1sexp2=print_endline_if_non_empty(patdiff_s?location_style?context?keep_wssexp1sexp2);;letdiff_printer?location_style?context?keep_wsinitial=letprint=letprevious=refNoneinfuncurrent->(match!previouswith|None->print_endlinecurrent|Someprevious->print_patdiff?location_style?context?keep_wspreviouscurrent);previous:=Somecurrentinlet()=Option.iterinitial~f:printinstageprint;;letdiff_printer_s?location_style?context?keep_wsinitial=letdiff_printer=unstage(diff_printer?location_style?context?keep_ws(Option.map~f:sexp_to_stringinitial))instage(funsexp->diff_printer(sexp_to_stringsexp));;