1234567891011121314151617181920212223242526272829303132333435363738394041424344454647letsplit~str~c=(* [i]: current index in [str]
[acc]: list of strings split so far *)letrecrev_split'~str~i~c~acc=tryletindex=String.index_fromstricinletbefore=String.substri(index-i)inrev_split'~str~c~i:(index+1)~acc:(before::acc)withNot_found->String.substri(String.lengthstr-i)::accinList.rev(rev_split'~str~i:0~c~acc:[])letsplit1_exn~str~c=letindex=String.indexstrcinletbefore=String.substr0indexinletafter=String.substr(index+1)(String.lengthstr-index-1)inbefore,afterletget_whole_lines~str=letrecfindiacc=tryletj=String.index_fromstri'\n'inifi=jthenfind(j+1)accelseletline=String.substri(j-i-1)infind(j+1)(line::acc)withNot_found->ifi=String.lengthstrthenList.revacc,`NoRestelseList.revacc,`Rest(String.substri(String.lengthstr-i))infind0[]lethandle_input~buffer~input=(* Append the new input to the buffer. *)Buffer.add_stringbufferinput;letwhole_lines,rest=get_whole_lines~str:(Buffer.contentsbuffer)in(* Replace the buffer contents with the last, partial, line. *)Buffer.clearbuffer;beginmatchrestwith|`NoRest->()|`Rests->Buffer.add_stringbuffers;end;(* Return the whole lines extracted from the buffer. *)whole_lines