From 9bf5e2e68ba0be69135b0f9b8d3753fc97a22b30 Mon Sep 17 00:00:00 2001 From: Humza Shahid Date: Tue, 8 Jul 2025 00:25:52 +0100 Subject: [PATCH] write all preparatory merging functions; only need to write top level merge function now. --- dotscape | Bin 978656 -> 978656 bytes fcore/quad-tree.sml | 95 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 95 insertions(+) diff --git a/dotscape b/dotscape index e59a088d07f6c4eee1b3063d0c7671179267a531..05f0f4e1b5ca990b8006ad7f1588739390118236 100755 GIT binary patch delta 24640 zcmbt+2UrwW+xDC@fGoI3RY8OWkuHiFds(nyZxef2FdBP{EoyYJ#U63dV=(H1(TIsg zMV)A(g3(wK6R{-5s98v2EJP)yfNzxlJ~OlIy6^jb|9Abr*L8E|+|P6RbDmRXR@?2i zw%ctFq|w07cKp4;`^n*E-~9Nf+wE=Q#q_6>Mih*o{gTAg*WW4lxXDB>;#CmRwkx3# zk(P{hJ$SIcT`7WsjqMju2z`u$+^IF9U|g3&goh#Bd_*3`_xPKVFiT|bw)i`$_cRh# z@OAIiI+`0%Fl_M0-iUgQnO~FI#DW#mJSfd=TCjdbB%wC0KCQN!~4?A0{a%d%)r z1L9@Ln=^{$#aZawcn3FN?x^U}IP(>{j8tSG`#cY!GQ$I*mrz-X{HdFePfbErdJW6B zbCYO#V~fYUXp&ygXx`hR*O&nFm7P?`H$@bjT(CeyKeSmKrqq6zS&4qT^eQ2>3id9a zB$AITwO8#VA(rE-y3*HzEp+u}9^|afqZz@L4r_MP$Oe|XYx3xrV9V;Yi)kUTc(2

y#xOcvLhOrujHah>5%0vA^Ewdg)D1^kQM1^zLK|u=9@e%8S9$`7n1Un zZd9UzvC%J& z^A$IAVM&bTp#}DoJm24@dFP@gtot=<4`u!^YcNfoS{;v6CY{8$q z{zdrA{r!VS$_y^u`#L4@1wHo7r!=pr<%^H|LbdjR(ImKF&VhOak&OpG#os=MWK_wc zpeN?dfPxTZwog4$07>N0∓cbPWFXkRi8hmUrN9i%)o|t3TnTx*xkrskL#z%}n*sc-OiRN*g(ilGA@JW`;yY&igT>pspSTRxTGtv}l+4x;TEhIM9P!mVE3zDVD z%|MIoyKGt-W0`ZKqZjuRM36?qPn^1OiH-}gtp9!~XH8UP>)kxz7!nta2A@p9N<)*D3)~3H~UA^)!-6QL| z=VPjOElHvcb(T3L!0bBzk`_YctQS>vsGBkW|EBl#!~aRoa`C5nK^STQL#-H>C`bal5j@DV zpW1RGu*IrI(DCO75!Xn$%^L%ba8FHyUy<@cPeF?CL^WWIKh?AJ_+WMOp?$W=92%lx|wl$?i2g64g3S*yM1K>X1pcbC+Z8Efy%uWmdNhtkg<57lYMYF4FG7v@`jrbIuhskL zSvO21zOXCn1H5RERmh?+f^?nb&ZG6Uc}H74g#27MP-~u$rR3YFV9Dc8v7}o%JZ(b_ zjSA*J-AiamVnOtuJE(uGSZ?M$fN&2F4PwD}f2Z<|P{=cx)b!$uF9sQl?`%uN^MHaU z|7r-oS5W);hg|1$RZBPGB|j5M%NhuqdXpMF-li7Wi2~(2{$#6Cgbj0-7mFkJ_cMYBVlC7i(w<8vGPXjV+Qr3nd}ckRaEtPkIoN#?r$` zLiCt!ev%dIY`75kP{i|7vG!gn2!U6Z2*qY}n8^ouxU)lHB%WHm*qt!s5#i0Ag^{m= zC#~Unr1&&llwU+gS7dnk9Wi;h57_q+BwSzG&`&Zo zMWx+@ax-&}BxC$OU;T2zMD}JR8SVE0=)ycyamAwij%K0!BX&QMyiQiJ{tZY#?NSlb z8(S%wXsjG92**ehG*-{%Hz3W37u(-}Z1n5RGl-;W1_CLc%=$->dQ|Vvrbdwr632?8 zNC3%WzeJJdNE6bKbR`)qy&)Oc=*cQxC0cA+k&@r)S0Nj)J63d@Zn!y{IF<|{1~gq8+j zbOpw=yes0SXtY=H3W0m`Sp9g?N$+{gSIULubrgh$d2C8N=}Y#r6Y<1=ZoCsuVn{9K zkwC)2^7I&_nnI;$9#RpBIh27-tY{uy!8epq(JVEAOpKoivnfPZXTo9$ws$3%XVru2 zs|{{1?Eih(w+Wak5pK*Yk#zMNQ{gM658!77)tHPdJ&`0d6!!Wyw{|riL+$%py9&o_ zPlZ>kUw1xceJV7!PnJA(FcDR*&qyN@Q@aF~L|{qjuu3%Om}wAp-EOQyBa%dIHQ3Zf zqzB#U&5k!BEp$7d_(~Y_@?Na65oz{Xi8tDZc4cB)xdio3kK@lIpO}o5nHV9GhOjn5 zZ2U4qgi1ODn|b)BB`d`I%nTu`v<~#)HkU-gZKBl%}Rq==O?CSfe08PUNo zbWKPC{pcF=X-1++Asg8Qiry@%30X>KRkQ7r$u#Wp*#2bFhIUlw80OcMtRY6Wttkxb zFQ#vX;T6~`%}99dT<#iq&-rUT7cEp;-PputWIN5J%&R%6S0Be1Gd~aXF;*JUQ~YFS z&Vz3nh2xA5OKnc_sFkw2%}GvJF4eLdr)HPVLtmk_X(Dtf+x`lvM?`iUK`@4F3HmdA zrg~P)ME|AF5h`;<_UIM3Rht_d)`DD#%*Aq%ISgmO)i}VQ^c0jH0S}A5SGaT?>x0c8 zcFb&kOEQ(5VkxcAJOlG}ol(s0& z#3r;QErYEX$wCkGCK4L7uHvKmR6f=g{*x?Mw5iRDJ!?lM){elDE|a1Upq|Okxv5wt zec1f=B!e0nvpem{62e$|2hxf7s^u8jr4Cq(e!R?$AckdiB;nNBlpX4b6o)Uf>spBomYNV0~Y#Ug7D(OS??9Eitk_51WsU(Kleqc9K zNmz@9IN`d(B$nVf8Hp2aDo(hgvBj{)2J%frxj8OS*vQ>o3pl zgdBa85kkxOs9}VTcg6^nB+7R?lMq5aX3*>i=bh43?YgdH0qjwU8JWHt>B|jxR5vn- zY+)C>p|js%GkPe4TAYSHf88FN(VcW7J=GXiz3!L~&DB^TYu^L0`bv!2wy~TZD3ho{ z%%q+q)^9DEV(^v15vJ8dxQwOtBn|Xw=&UGTDJ=$W!pLU!Bm-bfXM2(nwV^2Z1u6-2 zwGeK=md!Viec4N_&!k?&mt16Hdtvsi{!SSPztu0KP&16~G%5ZI#%2v=KE25tI^+`D zn}%`P*PFDZ9hFG5pJB-h>AS^H&LG9yVg|E_K4c&by`+xmwmz8pHB?IvKS@~m@8S@tl#uFWY^agBHUy_4`yRt8gXb5ZHk5o}x1JZ*rws=stk5wI6B}2D@Tml{8-2c5>NIhQFz`dBS^pM zlv=i}*rgF@`z%!l7CRDqm|!+@BnGSnCu7+wqllq8nO5KxHg*&W+|SmHLZ?=pR|my! zH2IL%AII%TTGEu2jwT(*K^9?xs)= zHKnTFHNsz>KZeX9)Zi!o{u*h@A6WD_@_>i_uaieSq~pod4kj!cX1*80F z--Nh1UZ~uWL0V^0l4S^BFWw*_AsM)ZTe7}JK0n4}uJ+8&q%_OCLYHrgXH933i)21~ zj(T9mH=Ip|G{n+U*bc3^Ma$D$2Pn5C_4)ZFl@wp$VJR&(G-G+QVOWh>`E1PZS1u{- zWc}xmdjEB;F?J46)*3^X0Claw3aMOORq!$g{Rdw;6yBFFZ6wp&^eew~aLeWHj4TlKyDvJpopNyw>FB1n zTySt3aBtGB^F{GY-iqIsFiC=0~49xP1B8QO<2X?cgl3-=|oM^hPJHy*%MFa*Fz_D{|8Zu*=(4vxvB z0fo_YcH&axp;0t}>W_Zl&?}I$qUmrq{d>C|+`DXKA`NGT1~f=+lt3F0eJ3ZWQHHd! zm;UfhM~Z{;yDjJsqW*ZEgOlaVHuPUa-^z)5MPAj8juG`Eavgd@<;sqI zfaXJ;1Xb^{&BJJzY#vFQ6aC(I9Z5cri$+oArqA5s;1are?uWUZc3kSvYbQ_ngeKI`&&YIe zQ{`Q!Xis;2J+p&@<(%Pl`D>Abdn#vL;Q8Hp%fWpwS6<@7G0ce@ER)N;&NCJ|^ialC z&aGVF;IOQGN4-V;>G=*04*n+njt1$RI1fCllfM6V7!K2II>b$Xf1V@JUHNPY{ekKm zJ8>B6pQ%jsi{?7?7RWPxrC2!G90!*z>mSlDslH^kgS#XD@*A&MJtqzw@`Uzv)4R=b z=n;A7pS&|$%ye+gw~+O4Ahe@!;8;k_LmO| ztILMf5}Q#QVeixud(-rK>`pClD%s6Se9=;2+7qcmt^e54^}gtkOjXS^@re}tpViQB zA*`Jr8aYDI^(h?tMEb+Wo+W!Uhs3jMT;4*F^NTHiaV~b%xdCFJ=ON*QO{^Wii(T*+ z6L4ty(_egp{K!&ji!pwNK~JQ)Jf}#p*mTHvY#L8ekBnz00-!sC-475u;y4r+C=Mh! zJV`9u6)2veyzc!xDl!?zE0eg7`3&LpVbx@ z5xR94TNDVh$*n8)q>F~JKE7gfm=OO&s;yU>#P|HU=xf6J8oOHbbJJjP7#*bQqIpMx z#WA#*mQPBE*ooHFWJb0xL~Kh-!q|flF_ni&^~4Nvon_S%aVQOB$LopFoGz`0k*m+T zhKl20Es(|r)qEmF*Hrt0TL!O2De?(L`f-W|n_XXAO4=%U5i5%b6WfwVHD+eZ!^Fk3 zVu;clbWEdgu`Zd+x`vCx$OM)fE{2nIRunEa4m13h6U&c%h3woI^~7QbWYGpOEHXXt z_tN{nh#inIE3GZnQM9|w_%SX z#9)3K<`pUSAwg_tq}Y|Xzys29EA>Et0>^Y<8~CxZi=RUjty%lwji%6 zQ9s+6$I@>))n53~<2Jj{P;5rps7Y}$ix#J00&I##zrW9pM8k~#Vaai@%0gB@MjYW> z>}s|=MjVa#`b&)14HE=vvF-;ROI>yBP6JH6S+QaxXMNaMEUGz0$&cDTV8h~+it+5J z?R|DUP8@~vw^EvwrNoOLljp2FUTmztw6LlUKNp(fjmKVNjS|osx48t#HnE(9mwRIx zD^EZ%?QiXr%!=RB6?*WkvED-h%`fNg3l4kjmAQ8L_uF!QlAh)cD)Mze-ZP}d!b z6qj#VO~hXM>Nko(dy_}7{jp*j7L_cfkx{Caz&0hrhrr(>NBDyK$*6v^67w;c9!nQI z)Y7dD*r2B3cieq8ZYFjiw^(sAWtg@#!+@SuV$?Q(J!|%I_Y7wJo1=S{+0~yn7k?m~ z)R>i#79zu)nvxazqXn$tHF4f7mmPgB$y?Q5&V{Hzg=rK@fz0}GDnsPWk6EV&Jw)M0q6 z4q{!lzK!S+{LwIs9l>S!lJJTr@s7S;#`Zy%TTB~n7r`u~?aK|vO>kQ@{4+&?n{zu< zW1FU~XF2U)jLVg1w9V_WRG-%aZ8fbn9t$!F*#>jfE4C)uiaQ7kb3+!^9!_wGnjeh2 zJ!V0>>fAeEY8+y3b-+a0%eHk8`_dQv*wkbZuJYL^)fCjY{(wi&40e&%RQ#HRds9>_iEPote;qMs@N><+tGMIpiq8USMAS+xU5z#NxQN}ox~{q zf}MX_z~6q4=ONyHkLe_y(7nTxiUE7qvAE9IC4|has$+5&HV`2oD;dw3joJE05=OW7 zWnpMK%k3-%ctrmCNXpd&OEm%M0zv7|kE9|^Fi8`ncR^*tkd<|c`HBhmRflokWy&B~ z_ztY{Crrag+>6?8YX4y;x`=iBxoz_mwnv>l}PT2RsJ;V z-BnDW_3RbvDmL(-Hy%m0#%%jg5{506A9Vc;#~(?IIL0cEMRXGzkb8=hU+i|nbiJm= z3fYNnVq4`S#HGqdi0n}smYqBnmnJqQJ5?ns%S;o)^&6ZzY7g6&Cbs;ybg3+;JJOA> zE~>j29(3I)-EVmQ10NTpv0NyId1FpF5Bj^URdeE|RQilP>W)?D6(uujv$8fl#F^Mk z?CSvw^Wbc3(AG!NcHG(7%`&p|kz~TgH5i8Vm=*U#Lk+BdPqZFh3NgRJO^>8mP6;U6 z$EEOEkW$-5_N=Ga6iW)Cv7s9tNnN2!Mi?tebG$}1Ifmyno6!sDvXyjRg=-&4iO>w+ zz`p1umPTwEE@b~brc=Ii)ACw5?71Pk&|7TQsP0IIJqOvJVbAmbL-My-T%Z4J)1&*q zrZ10BZTf50u&+3f{?JRYT{*We91oq|i**>TY$kg57bnr4N;HO*^cNYer$urHh=I7G zIXVE|^$9yT5ItvPy$8Y@VEIRk+6J*^#%Byo81QVgQ5b>Uz(4>m zP>)FntxI3D9E@-%=YZGPIteSq->gW2nWfs?I)kpRI%aE(6z-=(!<9mb2B=`ux!zjk{*UTo}R#W#Ise9?qu?Mg%vYcoNdNz=pG{t4oK z8mXz`3@}j)r+Egpd!kqngoVisclE?ms9cPXP$DX;q>^AZbrL*p7+XCFOYR9)K8a6- zEEX~u)|IbB`LSs-PM*`%7-r2B@khEdoFz>am*9Q1nq&dHIaNGFzwOLh63vf9({QT$ zn5EA|zrjaM7aOCw@{;MI7a@aG8cH+Z@6q7W890bVsH};tnh6$tb9AP78sqrp8(8Dd zbz%$XCcMpZmO!Yp3-5E`pUiJ5rikrEnY0czB`~rCQv@F!fkg(ZcyLM6xmqTTg-#*M zS_++GDr+h(llp_Ts_ZUJ_v7P1@_o1iJ3E0YM6 z464$rT83xJq~FSU1(m|_y^>l%-3nB&k*0I1Ogal4%<~nfAU-$aO*5S+lMaHls;s-h zQrmI%Yy}D}XAy66rBBMFRZuc9@-~v*R#<8~!gAh*(gh`o?zj(KazssHJ5VO|R%)aq z$+hdOS_z$XS_U7on=6sQn`#nMewpN_R3&RAN*Svu?Pl{=L8-r{^nRIi|B2E`T&cav z+H%XJ>tKycNgAi=?kJOrz@o3XZjh$?UYWEHEc%MGL}5{T-5S&kn{Wg=8!MBRLkE4e z20Gs>EOhd@&RI=oW0^D(I%al|>l{>B(}pssJ6My-Zc|ulTgP(Nq7kb!r8Q+z1e6S_ z(rhimm1UA1te_T}uCUz7)}heeT1HFR&2`AAwOtsu9>Rv2a1ooo9zs7QsxvJtlky+) zs${N51+im?uFm#mnY0Nkx@sNR`zmXiTP9_K#k$0GuPZFI&0@#jL54*<8s@bj!qzHl zv_KxBvo@gEeJmLPwM}EgHbCoLC8{$`DU*_sm6fG$Kvv6D);6(Bst?wzvNJT@@nw<@ ztVv}@Y8j4YIa$cCyQVazOe%TA>!xJ*il$^@Z8kzFLW%Nj+K4LY)g-pzWzsGrDP&n2 zQHM%KED*x^^WYaHrn3zyliq@kS=A}F>s;VECzKeq^=Bd3C?sD^V(MEar6@H?wjkS0 zT1LIfq()!`7Lg4$)1HxT6Ed2j>2xcT+?5LXZGz5FyG}mW>7wbRmPxmN;}ueLlI=R( zH$w-X(V<>CTl+HU2y~39j!tDwZOf!wu&^hdJG>U-x~<@~z`~w53$F#1cN7ocwGdES zGj@}qfpAxu9uaUySO@T#?bU6s%rWBoUxGCrqGQS+8gqu?Gs}DB?)~d2_ zQ(&nrggwha1>vT)@(R|4n}QPD)K(;gn*vL1K`du0l;EZmrGPRi9ZCjO3GRxsHea|a zu;?pZD%=%V-dFD-fV)yM@@6;RLq>2{sxWRFgm68w|^HACcR#0`}t-$gw+kpVy3W3h{ z_d{tpbkJoxkRQAi7s6ZZz~%;vIAYXR&O)qWSKJ4rTd~b*!j@abzWlm|t6~#j#o>37 z8pFiR6&I5fHHM<{aCN(drRIs7v8PlLSQ);%j=`BDYZn5n=REd<8nd$8o!IZ5QDexO z%MPe9qul#_Y{p;@JR!B6VaIpjQoEHVWsP=Y--;_s2;{OCMFUeLimFhN&?#+m(;xU3n~){h5z`i&Z7q74JnVUwiD*UR3`X%lZ)Nxa0c} zJ5Ai|B1Uc5?D&T-A1B^mB_E>R=ozk#Ez3v9c%u^YGOv9o#ovR4U_&ziN8Lr7j!j(s zP^t~KkO~I`Q$p6!PA?xP&lofr?hv}Mlzrl!ez*)U;cI*T#eGMESYCusNo|PF5^;i4 zo`smKfG$F|@@)0X^0hzXXg1rWgr%(YesPTMNoV!=^@#1-FMdg8vl$=b;3cs?KNhR# z!saaLGfb00x&A@XTNlSa-{s%0X2h$%vE!eInv(FT2fnK<#0`Nd3Fl34u%hF5O<@RS zD~@CPjqA`8VvJW|@Ixv4XH5KH7X2yAxh9+Xsn|5c#J|g2;-1fcoM%2QWMwY#$j{8f zCo-Yz_@_8F?<+S!c0L9`U*8i5t1GpX1nfTA@&g`x#sZS+(!FcC-S687#n zoZvo7Vv7p7U9$S;#g_Cn+&}+_!rwfP^Vv8}Ca~ETQ2zmHw7dEJ2hsx@jE~>K8S7`Q zZujzp+Y+qFOrcpzU1V8ySz%aKAk$wI!|Ru|#_a&l$`F<{!$o~D>wZyeQ2&;bO1g{6 zG`0#V)Tg?x*Ds0|yeZ4N1Vb{gtS=FKsm83VwsIi1p5rS zBrf1XhkU4Q89ROn*HEcS)XTi&fpqi7syg`e*5_-S?}9X~h3xp(VjKETVs)Q>14p=- zz50#Vjb2e%oq5&+X(AH8#x8v$en___vKKcnSh<%`w3+QI#&gYLu_o!uf{Sq#KVGFK z7mL1lQ}|Xfrd}U~(h09UknY~$3tU#QSdX?X*yx@yk}zfsr`kDLxE(<}N~bxxYkQl^(W)iAxLUaQVYr{;9<8YVt2Fs>^;DUJtY zm6*=f^?~&Kc2ym?o$Jc3L({o%9cz3C*8jQ~t4n<#eG3(18e5-+Z@UwelzMB&2h!)D z&C|^TK4Vk9#i{=YTlFo5;UqiqEiPA{vdr&MkX26k4)^!C`ctB~F}VQ`HJ`^~S;OzK zo(@$c-lm2Rr1D!;bvhoVa>4g_k&P`w`fcQZ8~a;g=>N_a%)v`Yo+#Yp@j$Bl;eT`i zGql;?u?he3U7h&KPxtIUqZxy{5ZyRshF%s-^|JnMrTT-0Y}Fk!iSm+Snfs5`&L9UX z+4n!f?D{gD4PCyI;mvd`%e28mujbD&Fxy{jScMF%Q3-nZIqP47dz-$otk17vj9gqI z1`ynJD4OuzKmD(o-Qy>54mPJnKk;T?y)UKT{O`@K@w2Ejd;ZU&(riKdrJ@O;bFfWkcpeW-224kV zV^a{?NJR^N|JUbQRh=-_@E%@iW`KSTm;_8?>G$vwaSbmzhS~06O&red-@~xZRw!!Q z!`j@(HxB|^cOTQKk5Wf={l1upOHTR#9xj8md4Scs9((hFcq%yE7u$8bOA!`!suYND z`1yiU`Oifmt1s*SP~3r)yZj+6B8j<|VP1vH$z|f#4anuAzHXgK{T3cojJOL2470>a zSnrV(gL!~~3YP^zm(`f1`?)2Muh=?2x4I*&30c$ss$x$?AznZNVOFO~+w-c!ZZ)bH zkB1|JhgDT|=5-YUe|a5mpJ4VPux6YPSPm{TMF_N4EPkSp{d_^uo=f>I~LE{Y(utZUG`PBrw{Y6c!sbi8$CVQ zjcm_Q*6&?Bt=tT0RJP{`w!wmE%`Nz2+X${=6aK8U;E!=LvP#^944!SoQ%JU_KZ~*; z1LW+<%-No?EYt$&i)_y%X4vEz#rE**NAUdCZbgcIn-Kkqr(L$m)5tFKs#&w~=hh}q zU*=}BQQ zRBAG>qi+t<8*_Mx3?(8v<*5m4!lmG9vd|p-fnYLwZwrdBGE{y$^NePolQpr^O>C|fCp(L$Y2x$M;&f+m15I2v!CrQj zvp7N%o2tb{&SF1JY^@fTJB#aSVq3L1qLWk26EtybqP^_?&f+&T@%U%{u8F5ti&LD%Y4)EG40yJ@9wK&;X?5T-`#`et9oyDrH3xcs)oaHQzx0hWlE^-!! zYU1|rlE**iE7gC^ckElzP3kJQAMtHm>%#gUrW(9~XbuCo}wGg1DTs>Q|5V!WAF z{#mQVB+aR6Q#G-zTAb`G4$;JhX7;kvAzo~ET>hGPye7V_#m#A|I@U1dpPe7C@msXe z&iB*e2VD48TKxRW{9?hN5w@2Ff~OX*aN(bHQ!C`#T@CF8-_ZD27rs#AjV}BigS~-d=nS`6OB)E;(7UkRTG$;1e{-~@$+2x=^DSmg&(5vdt7*<#uvKqv0b|> zjc?+@f1>ee3XlG`Pd}?BFu5dHsqyn%_~{zI!G#~9@q1i&qsA9H^L+ecHNg#M0eD}H zf8xSdq^d3U?DKL@*fieY!k^dpRxbPj@QVHQa}jLO5{!4@%^GiZ;m2$I78kys#vgFu zTWS3HKHB`Z4}n1w*jy5LYJ7zY|0G520pGqa_rwj2k9FY-HQrdwo6yhrw?`8UsTQdG z292NY!q3zAl`gzVtm~YWjIPhT^|2L4O zaPdHG@vYlWZDyJl_GL35X4CuW>h@39bSkux-_hcGG~EO(j$b?||Fo#!r#-CH)_ps_ zhL!W8*VyA)vI;FbZx+!XVsA}cS8KOj+mH2!c(Fx`U)D0u(&7~^@w&~`hS}vtEpD&e zcr9+v-mbUOC0*gm@x{WEmkGh}%F6|%xx}Zt#H}vz%P#Q>Ew1&B5U4%8ql9eS09~H{ zV6E2kw5}@`n1F0x3ve7b35>@scoBgA)k*NFAqX9SRA3#D2UGxc za6*XogojAO!yCX-U^nnFa2~h>{0ck-LUe-A8ZZHO02}ZEh=EBb108`>pfk`F=nnJ( z`T+fa*MX_PY+xa<2-pJb_JW7PYcJsz@D%XE8QBkr2D$+mz&v0la0K`UxCeOG#G(qM z0X=}3z${=6Fb|jyECdz-W?%`h3|IlI1XcrUf%S{=X9KVi$Obk8TYwzkJzzUv1@eIR zf!)Aq;0*8ua2~h_{0#g9ya0l6P0$dS2h0Z+0*iocz?Z-!;7=gX2Rp<>{7C{j0o{R~ zz-(Y1@GkHva00juJOus%8q`7$0qp<@mkdDX@2u*=?141fV zg=714esu2&V*?g-6NF)D7%CvA2YRj-Y@j#N_7#M~fLA{>s=pxIAAngRLFZLL@EDAq z1KfwA7l&c|YmUGi9f`!F1YyuX z5d}|z6PhdtU8bP7rlP{YN7G>8)6x1Fu#1_35dMZBTnDz!!Vt_Bgtz7j!nJuY+&AH< z<}Vh6N%PS~z%k$~a0hq*hzl?bKrGM`m;-zQ+yZ_Do&Z4$kqM9qtOIrfhk!4E8$dbG z@GT50@EWiVcn8Pw$dWDDVkT4EzD$H>yG{RNfB= z0D^!7U;r=~co!%FJ_pVM=YR`98Q^Xfgc?8{U~yyo83YUgwgXn+98d!M1o&rSKLNA` z+5*FXdB9d+8*m)B0{jL9EI}oJHvtA52d)5r05z6E2J`^N18abtOELb}@NgHn2b2NN zfzV|bQ(ywH64(t~0PX;P0ba{79f6)e24Dtu0-pgVfz!axK;Q~NXafucUIk_W8-XK$ z3|w0QD=ou=_uKGHKpHR!m;$T@@_+*18{i?JUy11kbOU+<1A*DVOc6tc(DL^6(K^6O zzCPOfao@%L+E!FOX@l8<(9jlBwp~S)5#c<9lM%j;a4o{|85LF65PFWOsH#9%6JgDE znEnV22tyGzM`%EphA;}@2!yQ=E=1T4;Rb|8gnJP7Likxb^zLLlTn4ca;m-&+Agn<6 z3BtPV1>rKnM1)Te8W9SwRa8j`6A{ir*bd=JguM{Hhj22&0|*x)JcDp8!W#(RLs*9J zBZNW+j0D2K4g&?@D?G%4xP`DC!ZL*Y5dMR3JVMX0XaT}Ngc}eV5WbJFIl@m68WDbl zuoprb!Xa|dLGM~Ib!}f#>|}iokZrZM2X(RpW(REY-|Q#$liS_!Ugn1%C>7oJZj4`= zl;8IbCpVbi1MdXl#@atX%$JRP;N1-$8|`}F-5}00rlQIX4d?%`+z4CXjVq#G<~{;< zkCi|04v4e4h^|3&*@+897WcpvvPKWR!-EbxiLizUq44wXv-F4Fb>cQagw6KJ*R<;_5sH{*M>345AI}0t$)S0uhQ-{_&hXf#^M#oW26LhxwIx z2Z--SSFjzuY6h`(W!|2C2cXCk@qauFWGPSzjtzmnOCIgO9cGyj|68ip)Kv4dRL&W$ z1@}HH=BcbMWgTWEysY!k;BBy{;?2ATE}KRChK^bbk#k3R)3gN2ayFC@%Gu@yydgM)%>tF87$9m)3f&Y;kGUn|JT|X z)<0EWC-{u^x+V$*@PF-462<$Odn^-Tyk>tlRsS8i%w}}b&&B_JcfXS!U%tuRJL_Zm zk!$jdZ2e=A{4A$$(Lb(5F3bJ*=-;NqP5yqb{v1J=`;q>f8<{0fILN~ra`I9ATpejH z=bz$wP2}X$`i}_}{N>Wm^`k^0$tmabqeXI9&b_GbOGuzx{-yqHZI0<6ZuV>ey#`N<#+YdC^5+C_x0bnlQKE^vA&9uTXOR6`o3;ti=6qF{#*@o zUiTL$G+Tc2g?yk!oy?kD=l6b+eyBj;1gXdYRv4WO)}m{ lYML}g7&l?^*f%CM=`?tDQnD89*Qfuh&HKyYZGDOg{trJ-#Iyha delta 24558 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 if prevY = newY andalso newEy = prevEy andalso prevData = newData then + (* Y side has same edge, so is mergeable, and data is also same *) getLeftmostX (rootSize, rootTree, newItem) else prevX @@ -386,4 +387,98 @@ struct prevEx | NONE => prevEx end + + fun getTopmostY (rootSize, rootTree, prevItem) = + let + val {x = prevX, y = prevY, ex = prevEx, ey = prevEy, data = prevData} = + prevItem + in + case + getItemWithDataAt (prevX, prevY - 1, 0, 0, rootSize, rootTree, prevData) + of + SOME (newItem as {x = newX, ex = newEx, data = newData, ...}) => + if prevX = newX andalso prevEx = newEx andalso prevData = newData then + (* X side has same edge and data is also same, so mergeable *) + getTopmostY (rootSize, rootTree, newItem) + else + prevY + | NONE => prevY + end + + fun getBottomY (rootSize, rootTree, prevItem) = + let + val {x = prevX, y = prevY, ex = prevEx, ey = prevEy, data = prevData} = + prevItem + in + case + getItemWithDataAt + (prevX, prevEy + 1, 0, 0, rootSize, rootTree, prevData) + of + SOME (newItem as {x = newX, ex = newEx, data = newData, ...}) => + if prevX = newX andalso prevEx = newEx andalso prevData = newData then + (* X side has same edge and data is also same, so mergeable *) + getBottomY (rootSize, rootTree, newItem) + else + prevEy + | NONE => prevEy + end + + datatype merge_dir = + HORIZONTAL of {left: int, right: int} + | VERTICAL of {up: int, down: int} + | NO_MERGE + + fun getHorizontal (ox, oex, leftX, rightX) = + let + val left = if leftX < ox then ox - 1 else ox + val right = if rightX > oex then oex + 1 else oex + in + HORIZONTAL {left = left, right = right} + end + + fun getVertical (oy, oey, upY, bottomY) = + let + val up = if upY < oy then oy - 1 else oy + val down = if bottomY > oey then oey + 1 else oey + in + VERTICAL {up = up, down = down} + end + + fun getMergeDir (rootSize, rootTree, item) = + let + val {x = ox, y = oy, ex = oex, ey = oey, data} = item + + val leftX = getLeftmostX (rootSize, rootTree, item) + val rightX = getRightmostX (rootSize, rootTree, item) + val upY = getTopmostY (rootSize, rootTree, item) + val bottomY = getBottomY (rootSize, rootTree, item) + + val xChanged = leftX <> ox orelse rightX <> oex + val yChanged = upY <> oy orelse bottomY <> oey + in + if xChanged andalso yChanged then + let + val diffX = abs (rightX - leftX) + val diffY = abs (bottomY - upY) + in + if diffX > diffY then getHorizontal (ox, oex, leftX, rightX) + else getVertical (oy, oey, upY, bottomY) + end + else if xChanged then + getHorizontal (ox, oex, leftX, rightX) + else if yChanged then + getVertical (oy, oey, upY, bottomY) + else + NO_MERGE + end + + fun mergeHorizontal (item, newX, newEx) = + let val {y, ey, data, x = _, ex = _} = item + in {x = newX, ex = newEx, y = y, ey = ey, data = data} + end + + fun mergeVertical (item, newY, newEy) = + let val {x, ex, data, y = _, ey = _} = item + in {y = newY, ey = newEy, x = x, ex = ex, data = data} + end end