From 0464dd1ce337dd6b312339efb334074af81ca12d Mon Sep 17 00:00:00 2001 From: Humza Shahid Date: Mon, 7 Jul 2025 23:52:24 +0100 Subject: [PATCH] implement functions to get leftmost and rightmost x coordinates with mergeable items --- dotscape | Bin 978656 -> 978656 bytes fcore/quad-tree.sml | 43 ++++++++++++++++++++++++++++++++++++------- 2 files changed, 36 insertions(+), 7 deletions(-) diff --git a/dotscape b/dotscape index aa50f151463574ba7b1a7b5dedb47a199461d3b8..e59a088d07f6c4eee1b3063d0c7671179267a531 100755 GIT binary patch delta 23952 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 CmiD~> delta 24053 zcmbun34Bdg+djP4+DT+Okr7Eq&Pm9GL{L>@5>w2@u9}@hsd=iYw49iVmWmT@L)A%& zik2c}<0%r=8d|MTttxt=tr}9KW8x|P*V=n0=hXAO@Av<{FTdYq?R8)Gn(uY5Vei9v zwXO4N+dY{)wBu(#9Bnx4slWUuSR6Ko((Ak3TuLq}XG6 zw-LdJ-jfj&ebIY`4=+n78uI*ZKN0sGHP@dzJ&Kl2sl{2dqE*vk7`N6g+BdxgqV^jz z4g@=D+s;e1q{6I#v?^(llzY9lefP|m7)zk-Jd2j9vVzm9%#sm$NLA7(mTQfXs`3Nv zzs_92^Zo4eXT_kN_JUa>cy^MV&rWg^_Mbf>t{};Fo-byV*(jjEORCEDLgCdm9Cv)5f-z*6mpmv`kaG_>;->qM||MFG!lXz%d)b{>N!zh1ycHMFmI zV*$5uyWh%fQE^Rd=e&TXJ3w&(n3l{Q1r;j~* zRf}*NuSoC46)vS!IbxC93eUoV>nzutVBfu}lc>;dtJb!vsnD8#R>;{~RESj+_uR@E@scHRS>XsK^M`eq9jRrKqd9T;~+*qi5m&8?w!-!%~dmMGi#GEp~le0GAp z`I@#3cCZTDIIct^Oz4Nuf#we9%Ca$dUTA>ev~t))oPA(kE1n;0UzOLv)d^3Gin&nlgp%z>C!o~d zWWMtcS=w13#wn(#;o2s=O-(00k-m7Dp5C$CNMBD+AA^n*)`*T=LBH~!qV4n7cR)~d zbbSg7ipS`}62*vGlcXv~u>H}7R>JCAZ5+d`P3&)PoXfMD*dsQb7s1_4{RNlt)++7{ zwx54%I!AwW-Q1jCx7g=yzQ%uywhwvx8n;H++iaPQ3BPa4&unYaM#l$~^FG`_xb4Cm%XMLl-S6Vv$95Bi7{b@q%vU5aMyiC`kS zX76DU^x1bn)XA%;2VzD2iy}pe$@}*SF6O{-QTrPQvV}?yRjAn4sc(y*)j_TN6$iEQ zy$)UAEWGIQzf_TY%~7qu>qkX__E~$9>=TcfMWR*5z7WBP;!gz;SE7|Uy+o_~hO?dwlu;qfki`X&C|d6MvN#;NPvX|~6mewsD4k2pO`J&BkVu>zHvS0b~i0H<11DS6@7^YpYR9FyR^q{m4=Rbwo zdwiA5vm=YabHeT3&=k}}e1KYHm)c#c)yE)p^;*JKfw zkNUcq+T~mEMLyr(H}DVyI0nT*=I@BEB60=_HDzw7qjoDNNx6cTpK6y zWl8`4@{RV1*0UX*ifrfc#oRvo`$r<@^gepdH+6rp)R`3EfR8Ynr9vS0X0ZLJGlJi= z*e@fnrr7^&x)$;1{{~|9(B=U;0&$({-&-~6`w~t04 z&J`YoHx|N=9cQ_>QNMyX+xhD|JqycPNmVl*J+8|=(hAN04|-qR`QP;HXMTtb!$3~H_{aX3<%J)k4K1flcAJL~Cm_A~W*A@!6(=dmW%Q5(6!S-u+-xS3;yrjZ>Wa%i-v)vk3wD8_x z&GU8mtqpgWi{}2elkqZ3QQRL}c(A`*VH2%KxI=^K z#53)dhapAx|J_jdzoI%1cWP?KAGh*ATzw$3R<*=Kb3f*#N!rwA1)^Z}S}@zB73IXt z6-8xY5K$Dp9>&IVf0_OYW6imTtTwL04tdqN9t!Uwnt?^N3=RJcYmXy}9@J+M+!?9X zX~23gmPuJrta03^Zb6Cz3vaX(dPm0dZ*rZTT#`aBER;%Z=s0Tt7UtTtFN!5`haX*w zLLQdd^dO3T5kBE{p~p&(^ZA7(d}L*|Z_s|Lmq($4%A(m&)`!}g*%W4@U1m0lg;S7) zb>!As)ZfBld^*()QlkHsE8d`2EiBeDF)~PzJfz&?%k(UZk)5F5Z=lP+q7nz8rF2uzJsN&N3g&l2D#rt$ChP}v^ zQ@>aiQs=q{rZ=`$yh&QsNJ%=xnqlJ@LUUu$o3VbhJC>~p>Me4J;d%}dtC&dr8nQ@k z3Z}^oSvE_g(uORAXUEfxhO7nirHDqXD=(-;*^OBLruUbNTJcir()7aCKTCP2aH{i4 zpkfu9S(qmKd%oS`A(eLYm-cq2vPLXA$W|Mj*eb0`>-ZHug=G{Jht51slj6{sX1W@O z`oBS4;#o>lTb&@K;os?Y4lI3zZ(8z7#-?L`FTGO|7Nnf0TySBrl(ui7V!Q z^5a=YR!C*>D8=bzloE{LMJeeNlz>t)Xi@@7vC`E9l;Tfa5>bkS{r6JJr2i}>o$?de z(3qtk1uBaq>1nexvJ%5u(G_uP9NMcnhtQqquBarIVe&o{sN}=?I!e-=0-BV>`m)`0 zB#A|f?!T7A;`on#Mza_x=E!`Ruk5^k+d_g zrK4-wAvB<$qpNht`J42V?QMceHz3xO#n&l=Ju%o*7HktuI%FM) z-MA-pXv&hg)rTfGWj**P6CG~KTKT+lKTyH2SM;K)rmW?tAT$rn%E4xHA*yd_D4tm% zv!+$$V2oHM!a4}C9n6W4s`wyy?gZQUg-hkaoNR1%>p~wcbYTo!D4HGfhG(VF;S;g> z)eboRh4e-;Ys9>1UotGTtQI{;M*rsfQA`Sp3yQ^I=DIBJWFf*=h3#BRgHvG7ooQtX z8^B7aEQLi;;}*;Z#^KY9HRkVsMFA~X94n^b&7kN`yYaVDU_%r&_S+I{Cs)ik=HLdM*yTSWg#VuYG{0s)iY@#90uz_{V{%CO=vcBMR`^l*OomU?!XFA?1k<`LbK6TVpM-q54D9GWlJ<|?)0Sx?b!G_S=dcynd*$!BezCR~yAf9qNGBd_{Uq_bB zKRic=yF=DKjg9m=bxq21G*%1J;9JDe%4`W$I!@(OD}%+ro{} zb!EZo%udKLKpP)4ON<%D=Wu6?Pnku%(V0as_5ne&Bm8%ISH0i5vU#vZEtW>6ZtPjK zXhb(Qfo-KT-O$l*(zG7hh?ZuezhA75P3z9Ov7UMi3txB4g_e4(nA-P1tbrEe&ds#3 z2a04miCNT>B?PtR6*hCA5{)p^A7L}f=*ePDAEK)o1}d5H@DcCR^q#Cg&dl^_Pd2m; zG^LtddUq)>BR!s85-S-P2nrP(Z(TY#UrJ@4JLP-mHr9G;A}zx zz1b{2=q&Bb#4zpZ&D!#gS|l#Wyzr6o%>pQAvr=I$&y%GO8^G(I)rWL*AI$q&x-Klc zq7Tb#lpt4F{X>*xwL_GSX1Rj-gor&?;i$!Fg$ty#BOQROrZl22+la-xsxM4v5Ve1n zJ?74))S(~S$UA*bM-^0r^=D7>#zrKoKkLZ?Xjgx9xI`EGv%fH*&JJKh`3IlTZb+%0 z!eX)7&Qw@8zCx45VW;tvf)2k$;m<*Hm?15u&CfwMgGz+7xh^%?(jF;iUPV)}Ij~c| zff&RPI-;-yDjA51{QHbvE6ek&1^@AkC{wt)SD$Ao+}W6RKhK7+J>)ZpJcY$WetL{a_0Y#FR>@(|W1 zNNgOrxa7k06=QLb&JICavzkzyp=`2?hWirqQd&C{os~^ThN26OPz7S#8AK7oSQ6Wz zMd5iT4P$*>NsXLa)7fEY{tR6SRy!PRMmf`mW6)X&X#zbp0-J`KDj8*-r_m!&=5AU! z0zLcqls+;+BiZ|C#L;Djy;-QpbJ zbXh1C1}vi14Bfrv2dHyLv01pDG^xM7z?zE(iW|dji!k^_c2|UaESu6^hQAeSL4R?E zk?u=r{<+#JgEc{{jf4DO91U2%j$4TbNX~Fo6obFQ}TG$f?ghn zU2nb-`9(y^w8%PcZcLw!X9xJ@PelFW0&Hs^D%0nP*(aA;8`HiCm>t^ryQgqB-`H0PnRbhfZVURn|`zfkO`ufqXsO{K|G z*wBFWxajH^qWJX1#C?ma-%MdR)f{BBXd3InyPcqbmsxz!sE5k;vyevthd&72X=y-w zI-E!333@aGJ)S=uYkUI=eu>SBvSKl`i8aKnZ-il19megWg#yfS9q#a=qc5?jm@+S{ zH&M_Xg7t=b6j~9tB}r9Vve`2^9QTd2=+R3oA|e~RpoOby6^a8*&I<3s9L{rXOMMC* zk<@$!JHzJELsSFvzR^rJs1eqe;&y1wR9=zwOo(=C(m_*j5Tv z%)~5z>a5mG>Nkr;{*Nn8TIUdL#W8mY(N`QSlG?Rq&59FGr)RO)00&l4tp{4cI^yWT zEH;q+MEz!CW9V%4PcC}v;m4N65kRYEv!kZY7o@c2Ro!_hJzbWfA7NV|R#hQ7T-u>LAuvI;~hE4G>E&I$RTcUO+HcvKf zKjV_Uqn2)D9X(9;(=OR+wZRr9dzosVa>@MFrrX$ia+u|$OBRJ^QHclCZx;(WP{`VO z1bBby;ypj5sMW9)Tqx?JpHzERn6_PmFwyi!FAH?slfJ=K^qKkWIwvv%7meC_@)S>#W4BATS-s`U z7kGrdy2~Y-i|4tpoWH5Um&1H(^S?bzE#G%3q^cW2`8`k5{+%w_K6PybKPj7v3th4! z>bNNWx`%1w4wsBn7RzBYo!w;V>fnaFF*hA}*QHma=Em`%9;UapyJQ<^coQB?=2#x4 zHf_vfnW>W-o2G(I@il$;jw{7p6?gvM$)>{vE}5$4wBi3|rq*tFA2ZXp4wvj})iZS3lTBZh@U9t%Ek7xNP4-T-mcOxEepmjrdlxiE!TQbwm4Xz~bswE>hd6;t6yJYj#(WCg6 zUZykaT(XmD`glIY(==hNO9rPlMOZ-nJeMq7t(w8#@igsOLLS>1Mw_w+PH+FUYN&IwVMKj*t-zp1&WMSfRab;-U}tImqy z7~&>-US;P*ou|Fx(nA>+glyS7mki6wH{4G)9iQux!NFhV-|#RWH<=fn^-16F8w`i_ zDj(!wx;4j@=!W`98UK!(Qru)1>mRwwP4j2F^yaD4e&$#>X_iZtr<(5Y&$y{tXVk;nHL3;6FrXwwmsewNP{a=AArE*QdH<->YRz?ulFI1WK0W z@%+L_dOJXlrxIBXF=e|cj#SHJd4Xqu6MF@1Z_*q$i*YpBNAAzMQ;Cm^ONn>xD`kQD zCeQjGY7tc5S8mN3>bk{m-&a2RUv&2f-N$6{m$j=8KY0{eMKk^6_rwtZ!Z_>d`$~6Y zP>hWbPfM%H!nIzyExIxX+jTZf(yr_Z0@TU=GOnn5>KWlwZIb`Rf<+9Qq5wHMxIk=u za08Q#=J3UM4IM{+2FRnhmDAALa&z`Ot*R~e;aQF7T5WkU+fHSHXsI;izS5!ge{Jci zKy*lsu4Wy7UkU&3YUsBJY8Qk?4%2muN8eX|4|pO=?Elcm*#AY*S3$HDK7n#vl$3N|sbkWcCk_Bv=yxXi z9Zf`^HxHMG@PWE6nzuh3L(sy=Cp|*$#OoPc8tsaZ+w%N|bUQ-M5MgqpoXsv$ZlsK3 zYA79!lyMi?kgi9g}l zImi+vw`DPU%tlM1|Rh~G=eBW2fvuFpIx{OntS&p{gxcHA_3@#nrk1mYj6NRAW3W|0SpYciX^mv&8d&mu>_hZKi8(!#v-Lra_gJhY_7>V42NR<2W$SDQWIgE#nd2P9{P`RSJ0Apc_ilWPw{d$OcdxPc<#BUboHTYv6zlC z667ZTNC0C?Kt(5MIdbQ_G$c{0nkaxfx6q%o10*K7FWj}Hj%sed@%}VJIs|E z)VnGC^#Gl8P)SpH9^Yo64$1OdT%C&|V7X<=pk05DXu~Rrp({Wkc7ES+1(-2nO4)xe<=$mL`J6PlrEgI+ay{9w~6%nmnk#;D|D&?7N zkDqejqn;W+6ird>;SvYw`N6{5V=lC-$-M(6$Ub_t1Lo6C+T20z%O5>UlT&3l&Ifmu zb+TS{vbADn?u?*}j`C!m_e438t^c=ls3V;2KFUeMI?^Q#-gAR^j!(4ya#u-3+Uje} zAJRP)@qX>2xsU4#nYdaK?~OC4Gz}%cs-=o@-ny%VAr(IR%9TB&y-V@V`UkkaMR>J! zJ(*gi%Ta8J`dm7y+@SvmDet!d>4kp`%_w|0@3S4&wvX#NIWFEDNx45zX@=Y)@#~RN zo-PW?y-@vZPRwonMAEL*w3FOWypI=OA&8gcV?~IUoD^DxHxhhPUy4H0DZjHE;uZ7rT_xWj78wNV0^<6Qca;)@m|zfD zT~OI5WaXG-J8#8h)`z$Zvu3kgd_PttW?~F(O{*_+|E42d(?AE(}3<;Fa+x?)}BSTBC*uHsCgw+FK*?6!iS8)QCwS0Uya zs{*oglVjOUjTJY)-7sap(qqMRq?_DMe7?9y`+Sk^W@7m%pu|i$g}tNeI4CDmjyA1! z>!%&GD^qU$WU>qj>yBh&YYOTvM~7W>OZE$%f5#UHnUoL3C_l_8_aWc#jBZTAkgh+V zyWQm&_LPGu#qz+9g={EwJ3Vh9309j&Zk$Ce&YjSLq5}HY}}*wZv;yt7~wM z)3jblm#3xkEq>#!(gd2(?da29@^#DFp;F#oqdFD3H?5$x%bFX}>E3dSruBxqtU0Xu z8P+`aza)Q+68rpjiyqkr7JY7*ZqZ**qrUP0{#`H4a@G94@H>2JFX}K<+f(%JCr{u# zwP-w*^^=K58j<||atPm=LI?W8zuu?41JHG8)O!G&0k#2%apwTKJV1{4$LczPm?95N zU4&uOzGlFeD82FA7Z?EG1?wRNp<~gbr=LeSSjd1EXr+SH;x8&u;JIe&rI{)9IXSYC z`#KdiK+5|Q*76}wt8)0JRfU*&X_wz0*Zqv9J%@xnwS+#7PIr|b9zL$Si*5;NQ=_^a zX~;k{I$Y1)N`(VqnX(?kg7dr_`H!aLQ{wa3ke5>a^K!h8wdGx99P%utpnGQEMB1qB{7i(A@HTOgRlTB(uK%+FuYj^Wet{Ny|p(GIMUGS0l2sQaIoAEYo1nu zBj&F1-QSPvZX=%|sC6TwgeaOjL{4V4^~}svIs|4mp8gOzw}}mhR~|i7j{Qf~#p@od zWh3b9Pz+ZSN*#vn#YRoJp6RaA9Hj_rob;<6CL=D~!}fTDT$leCNnJ<4H2kY|u8xq0@;jNrvf?Rgq`Zk8riUYunN4kEm1V|v1<;5W z+9t>aHEFUFbFobtS*k`nSp1&VJF=ON;UnlO)7jn-+a~usEBM%hv z-DBjP{D-de2qjR?i}H&i(d`%Io<5gw(cd3mv0b4KW94;xv8E$l&pjNALq=9AwHYUm z_szmLmN@}ZVOcos9w+bSF@_q>1mkfgh>4`_0)z_!t zgl5sDR$4wCQgqOP>GE+5=gTi)xj)&7R!u`cRlJ0z9T8pAPZb6sr*ONH+lq#N+Urthez|fH(lpYNCK|e1%9RpG(N{t@%+P(ST-gOF z`btQdCPnRiUPsNaBS+xlq;h2mbkJ9?L+4vf3Y|is^NFFerd$~g9UJWxI(v1gb#=MY z9a5_<-K*-8}J+sJ4UU0#Wd zo~b4iSAlF~kn?HoDv&{1)W`Ztxl(vfR3&E>Du~@XbbXvJmn&-_MOUqa^p-BQ&MsGS zAjJwLbT4XB?wmn~-$aHbA{ynp+Tv`TJ5pkI&{?Zd>@G@0z@1ZQ$ZBY9(4s!pN##l^ zvT{(?YGk!UmpaFnD-9sE>C$P2?$~n02U4pp9d2Yenl|Pl!|sOCsB)$3uBe-q;Zuf^ zmD;RC$aV|SJJhbq}q|~S|g)go}np2&T&stAns+_~H)r@^Q8=SN20EP1o_!rPj9PN~#h2md6b&ct#hOsi4qdPw1>G~IZ(DXm6jLKkjI(`^VhRW53zN#Uj-MU8wm zB7mFHbfV#=pi@ji8<7%jO3SYS+!Uk^T?#h^sW{p_*oX?kO>GhttOqv*CAg_gND4Ov zDR+j^#!XOyo6?j*%9SiAnRO+&DMaCtS6W7Xboni01b3yA ziJL*fO=%f;l`9YNLAs5~-a-cORzhm^fVYCws!QRmG+hR71!)?kZiX(rm8Sdnj#2`t zS=WWP(scj6qwIoI(skjjAQfG<1p&Mj0w3pJca$a2L6>boe(+X;gtyv)Jq{Lg#JID9 zA{@BP7(iJLY`2=x5{KMZ+};RP>?9mG22apqn7H}!0+z1FP*ef#bhlDQfxHfzOD%ze z*gHsfk8-ymzFig*|2n;TTI9UIA+ z?_#5RLOg4&d{-Wd1D_Vdfo}(@`9?K&bqDsB_$El#Y+r~wx*>YZM%xOJysL;M&>w~9 zw*;NR?sz9s1y;w-?nLz;Q0{wB$F1Lc*l^;?7cuV4qr>k#ak6-c%HBi8(KSLJdzSZ+ z^BOJYYkT94l5`U$f*nnNoOxhwFrHl)g*e z@ht8ItoTk}e5>ElL#`-6sHHY1<;pnDY0px8Zb%m?PkVL*z8tH>5}8c;DjiJ4)VPJ^cYO|2u5p?7V~k|x}$iCQm7<_3I8n07E?&*bgD^l^obKy86_UY5Jm}w1X_C( zhZ0tu)aMwO8?^VBFvDY*UN~eP6Q=MRT|Opvz|~%93Ch6LUNOjxdJMK!49m0WF?^R< zf-FZ>Yvz=|La>`fI&C*wBG3QFDd`L?IgUbW>H7F$QN+qA_Y>@thkY!2<9=@R$2b8V z*F-4A^91gO9O4=uUx96DBOTiEE4~?yrB)~8lyH0jZ1ciLxYse~#K%rv_#i2U=Q@LF z{s}pTJ1taj0;h%9dS=);e1f@#nT^u4nf-|zDSlXE#?N6oBD^U={IJG>YbxfSRwzEs zGPj`HSL9ggeNwJP=1=8b=t`tdXmIqla-a-ePl9c@{RR|QSokpyZNG{%7eB>0z+9gq zuAz0vpq}>I8(h9YVe&~i#;2%*e&JU}8&2XN_fayM{tr9QS9x0Ufo`~sc*QhtwbYC?}L zVXX4cp=cZJD#f#ZsqD}CQg|uu<;UuxiKTKNULn3(ika6(6ZuFl+*WQ}6AN5!sT|4M z>KR$GZYvicl{};%e6@J!zu0lc`Ty09SDcsQYL!{UYbsxAoWvri^t?PkpAa#a5Iry< znlo)eT&T`Sp9K1Z@WF2p^a*i6jxjRw(=#f$P@NHe&9Eg28ST?%R@_(B8R`B?&q$wT zm|2s*s>#Sl&uH&gnDe;AxTyJ~L=lYEVm{8Ux0Q!iAJ>J)xu|V944u;#vA}nrei!8g zpN!ke*HB5zq*a;t3cRtF(&XrPTlpAb+f-Zsk7&}@xOUx7%fH4L9HsqVx-s!PHWQ!7Yja-zr5}UC5N}LJVWIIEqfO6q zk~K2-uhzORXhh4ep+#I2lt7-}S381@Si`>k9v0V^e4Oa;cL;B*6DY?C*StbJ$HQWO za$-Marlw`+--pz%On#pCO`twM%kgSynH<7!&7o<+ZU69p)#x5S$g{97E%`w-`ob+G z>+=8DXs;h-tMdpdw^(uU1H7EcVv8VEidP8LuMeuX zcZ+HB&+^cwZ;7n&Ycewidkmh(0uur20qM{rgico3O56bU`RZ}qC~9;QZ#T0cegT*O zOrflsc$@gTC_0{;H?bBDrCT>KtTQzcckZAzxA0AbL@RG$GWF5wNEdI(P4J5oejCm$ zo7&vQvK>h;-^B3?nk>Sf^dF;Zv+ zWI5?lXm!Ps#!Gn*=auXzmPdY_I$a7qsj^^?lPr8!EincxsZ8cc8{M8?qp}c>kd_l6 z!tQLfC9rm`WdPn3i08E0xt0Bm=c%=GM@%!G9kp|9kiXU>)C2GYyntG2lThz9^U2HZ z9YxL7c{ijzdEQAP8bSBhcze^OJn#DS>;^n}*uBlV%4)l}KUL;=2U7%j*Q49(5XDmf z`LBnbbB%W>W4ZYu!ZC?cCc8fJ&$u(f#ld<|ra*P@UUcJEM; z#GCf4#nU+<+mVNQT(f)oQnNhoXGPrt$$KqoxjGL8e=h#9=6QQOnVv9V?@WXsxvQjr!lPBUs?^#GTf@>YtXhD zI@O(?V$i2*=qz_S)}ZS(t}Z**owgXXwT3Qnr-KaIQA1a_(~$=4tf4KP+-ly~pc9%@ zm)*~ue#xN6*3dcbbRC1*VUPOWo;l25qaMSr@meg&1^k4V~&vdmFTrQk{90JFVNg zB&F5Rx$bmQb=fs^i9222pikA%74CF9gZ6G#UACpGTg@jJbY>0R&z+7p=w&r@jypZF zy6hTyuRHBkU3O}9*=6o@PlJB8h7RiHRyDIhudbof-Ra>5eXfR{=1#{Lw7Ge8+4=4? zevqR5S!?K0cN*`hwLeD<%`)ApHrb$^HFT;w9bwSs7S&~ExzoW0J=UOKqFh10ge6S; zjm^|ktvAA#sKlLaZHQ0R&=u~qw;`^qp)K9rGQZSK&pe^K9==5V-02+#J*bAxai`}P z^s*XyuREP-&|x>c>Ri(Vz~p4C-Lb*E1mbn6;A%bi|t&|_=pTz7h`L9ef& zOWf(!27RiAu5hQl4Z5<1w)AqV`K8W!jT3rR*Sw!Qy~Cgf)zCTa^c;g;RzvS~r!x)u zU=3a7PS-Q&n>BP$Z?~%5?4(zzUhnFvrMuGy4LY-ip5{(3Gw3-rbiO-1$e?%B(53El zfGcLZwua7ir^g!f`Wm{#oo;Q=r)ua5 zciP*aD{E*=U$>fHO4nC?w_=O zo8jMP&**~ZDd<^Lp_&$(pL79yz$5-fQ@Wr>8}6;%vwF=kjqqKX1{$}ABIwuG(5f_Q z(87rCFtleHaeQ>H{TWf|juBsG_|$4SeqbmHPpOU@YL!NIv&quWr|yE;23^l+f3$TL|TFs{!@#=iX>hT3QsOf*zip!ozSo}o%{u6QYQ~xX| z^NIM>C*qEO#2ZV}xqk>GsnUoW^^!u3hnFa;zt6itSB>Z#qaWv~;RAf|QmndRt6S;y zaT*cO37We}Q4UnV-P4G`L&L!(Cy)p)Et}DOdJZUfZEsb= z@id0b+8R>|_yj9RSX*=vPARtblEgY9L!f>-tQ(Lr&?+2{rivp{R~Q>Gzndft$;40r z8+)MVdcg*IBW+(v`VjDa7LDpBNw@lAmMGA9PLjN^HZ27_2cs8=kfaH7(M7-^;1l2)a2t^4 zVHkh}peHa3I0#$;eg^IXVXq()AO~0pYzOuMp8=PE3ZT)e7*^l~U?uP-un~9%IJp4- zd%-vRt&P^yi}2LT~K7|%cpUF#ccR;RbLMC;H#yu(sDfby#~(&WC9a_ zNx%xA04M^!1nvN)WteV2H=rjl0GJ6(moZcb?XO)N=>zzx7f1Tt>$~9Dwv~_Xx4~>d zXl{!s+ph9)8p1gUCnDU6@C}4xvnwBeh0uFc<>N|({s{fsVfrI9Bdm|GB|uhfS0k)Mco1Q|_SkG7Y=ZDU!Zd`^ z3zd%*giR36K-do9GK9SlzJ+ii!aWFIL3je;8wf8Ud<$VY!uJtM9WW9ILpuzRq|fn? z0KpZ6?GTnDd=}x~2*)Dy9*q_t3`Mvap&8*;ge?&sM3{!~bA-JRIuQ<1!}j{sj<4tZ zjALILu!n7~^LAJ#duU$B+Te9T^0R8YOMZ)k@T-uLTYf3{y1(L*0+n(fI`R6{vG= zviiv4CS=9b^p0P2*oSTu))1*a{QOqRy5mQthcS0KwH%P;7tH$b^}ly@Xr|AeeQWUo-xFMc8IXMn2iD3N1lP(tRO#URKg zJ|UY3*$cE6S+HTRee#Q+`pGZ;@6}<0)oC6kYR~GCPX_)AtP|8P!&Eo?gmEq25Cw?8 zb|{JC9{eWdfW|w`4H>3y*g2Zk$ut{phi-K;;Tt2hduLPpv+OH%TAt~i%zjj})|>9t zX6Mv?J4~-}=AnMO({z#{%zxi>(u2)V$L$s2B{lVcX|@k*sTLj+dd<|-4 ztseT;w19=%f;(#ssJ5T^FT>}fA!z4!;GI NONE | LEAF (item as {x = ix, y = iy, ex = iex, ey = iey, data = oldData}) => - if data = oldData then - (* data matches *) - if (x >= ix andalso x <= iex) andalso (y >= iy andalso y <= iey) then - (* search coordinates are in item *) - SOME item - else - NONE + if (x >= ix andalso x <= iex) andalso (y >= iy andalso y <= iey) then + (* search coordinates are in item *) + if data = oldData then (* data matches *) SOME item else NONE else NONE | NODE {tl, tr, bl, br} => @@ -357,4 +353,37 @@ struct (* bottom right *) getItemWithDataAt (x, y, qmx, qmy, halfSizeAfter, br, data) end + + fun getLeftmostX (rootSize, rootTree, prevItem) = + let + val {x = prevX, y = prevY, ex = prevEx, ey = prevEy, data = prevData} = + prevItem + in + case + getItemWithDataAt (prevX - 1, prevY, 0, 0, rootSize, rootTree, prevData) + of + SOME (newItem as {y = newY, ey = newEy, data = newData, ...}) => + if prevY = newY andalso newEy = prevEy andalso prevData = newData then + getLeftmostX (rootSize, rootTree, newItem) + else + prevX + | NONE => prevX + end + + fun getRightmostX (rootSize, rootTree, prevItem) = + let + val {x = prevX, y = prevY, ex = prevEx, ey = prevEy, data = prevData} = + prevItem + in + case + getItemWithDataAt + (prevEx + 1, prevY, 0, 0, rootSize, rootTree, prevData) + of + SOME (newItem as {y = newY, ey = newEy, data = newData, ...}) => + if prevY = newY andalso newEy = prevEy andalso prevData = newData then + getRightmostX (rootSize, rootTree, newItem) + else + prevEx + | NONE => prevEx + end end