12345678910111213141516171819202122232425262728293031323334353637moduleParser=structtypestate=|Current_lineof{n:int;value:Line.t}|Finishedof{n:int}(* [n] represents the number of completed lines *)letinitial_state=Current_line{n=0;value=Line.empty;}letline_number=function|Current_line{n;value}->if(String.equal(value:>string)"")thennelsen+1|Finished{n}->nletstepsti=matchst,iwith|Finished_,_->st,[]|Current_line{n;value},None->Finished{n},ifLine.is_emptyvaluethen[]else[value]|Current_line{n;value},Someinput->matchLine.rightmostinputwith|None,line->letvalue=Line.appendvaluelineinCurrent_line{n;value},[]|Someleft,right->matchLine.parse_stringleftwith|[]->assertfalse(* [Line.parse_string] never returns an empty list *)|h::t->Current_line{n=n+List.lengtht+1;value=right},(Line.appendvalueh)::tend