1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374(*
* zed_utils.ml
* -----------
* Copyright : (c) 2019, ZAN DoYe <zandoye@gmail.com>
* Licence : BSD3
*
* This file is a part of Zed, an editor engine.
*)openCamomileLibraryDefault.CamomilemoduleConvert(US:UnicodeString.Type)=structletof_listl=letbuf=US.Buf.create0inletrecconvertl=matchlwith|[]->()|c::tl->US.Buf.add_charbufc;converttlinconvertl;US.Buf.contentsbufletof_arraya=letbuf=US.Buf.create0infori=0toArray.lengtha-1doUS.Buf.add_charbufa.(i)done;US.Buf.contentsbufletto_uCharsus=letfirst=US.firstusandlast=US.lastusinletlength=US.lengthusinletreccreateacci=ifUS.compare_indexusifirst>=0thencreate(US.lookusi::acc)(US.prevusi)elseacciniflength>0thencreate[]lastelse[]endletarray_reva=letlen=Array.lengtha-1inArray.initlen(funi->a.(len-i))letreclist_compare?(compare=compare)l1l2=matchl1,l2with|[],[]->0|[],_->-1|_,[]->1|h1::t1,h2::t2->matchcompareh1h2with|0->list_compare~comparet1t2|_asr->rletarray_compare?(compare=compare)a1a2=letlen1=Array.lengtha1andlen2=Array.lengtha2inletreccompare_auxpos=letremain1=len1-posandremain2=len2-posinifremain1<=0&&remain2<=0then0elseifremain1<=0&&remain2>0then-1elseifremain1>0&&remain2<=0then1elsematchcomparea1.(pos)a2.(pos)with|0->compare_aux(pos+1)|_asr->rincompare_aux0