module Data.Tree.AVL.Internals.HJoin
( spliceH,joinH,joinH',
) where
import Data.Tree.AVL.Types(AVL(..))
import Data.Tree.AVL.Push(pushL,pushR)
import Data.Tree.AVL.Internals.HPush(pushHL_,pushHR_)
import Data.Tree.AVL.Internals.DelUtils(popRN,popRZ,popRP,popLN,popLZ,popLP)
#if __GLASGOW_HASKELL__
import GHC.Base
#include "ghcdefs.h"
#else
#include "h98defs.h"
#endif
joinH'
:: AVL e -> UINT -> AVL e -> UINT -> AVL e
joinH' l hl r hr
= if hl LEQ hr then let d = SUBINT(hr,hl) in joinHL d l r
else let d = SUBINT(hl,hr) in joinHR d l r
joinHL :: UINT -> AVL e -> AVL e -> AVL e
joinHL _ E r = r
joinHL d (N ll le lr) r = case popRN ll le lr of
UBT2(l_,e) -> case l_ of
E -> error "joinHL: Bug0"
Z _ _ _ -> spliceL l_ e INCINT1(d) r
_ -> spliceL l_ e d r
joinHL d (Z ll le lr) r = case popRZ ll le lr of
UBT2(l_,e) -> case l_ of
E -> e `pushL` r
_ -> spliceL l_ e d r
joinHL d (P ll le lr) r = case popRP ll le lr of
UBT2(l_,e) -> case l_ of
E -> error "joinHL: Bug1"
Z _ _ _ -> spliceL l_ e INCINT1(d) r
_ -> spliceL l_ e d r
joinHR :: UINT -> AVL e -> AVL e -> AVL e
joinHR _ l E = l
joinHR d l (N rl re rr) = case popLN rl re rr of
UBT2(e,r_) -> case r_ of
E -> error "joinHR: Bug0"
Z _ _ _ -> spliceR r_ e INCINT1(d) l
_ -> spliceR r_ e d l
joinHR d l (Z rl re rr) = case popLZ rl re rr of
UBT2(e,r_) -> case r_ of
E -> l `pushR` e
_ -> spliceR r_ e d l
joinHR d l (P rl re rr) = case popLP rl re rr of
UBT2(e,r_) -> case r_ of
E -> error "joinHL: Bug1"
Z _ _ _ -> spliceR r_ e INCINT1(d) l
_ -> spliceR r_ e d l
joinH :: AVL e -> UINT -> AVL e -> UINT -> UBT2(AVL e,UINT)
joinH l hl r hr =
case COMPAREUINT hl hr of
LT -> case l of
E -> UBT2(r,hr)
N ll le lr -> case popRN ll le lr of
UBT2(l_,e) -> case l_ of
Z _ _ _ -> spliceHL l_ DECINT1(hl) e r hr
_ -> spliceHL l_ hl e r hr
Z ll le lr -> case popRZ ll le lr of
UBT2(l_,e) -> case l_ of
E -> pushHL_ l r hr
_ -> spliceHL l_ hl e r hr
P ll le lr -> case popRP ll le lr of
UBT2(l_,e) -> case l_ of
Z _ _ _ -> spliceHL l_ DECINT1(hl) e r hr
_ -> spliceHL l_ hl e r hr
EQ -> case l of
E -> UBT2(l,hl)
N ll le lr -> case popRN ll le lr of
UBT2(l_,e) -> case l_ of
Z _ _ _ -> spliceHL l_ DECINT1(hl) e r hr
_ -> UBT2(Z l_ e r, INCINT1(hr))
Z ll le lr -> case popRZ ll le lr of
UBT2(l_,e) -> case l_ of
E -> pushHL_ l r hr
_ -> UBT2(Z l_ e r, INCINT1(hr))
P ll le lr -> case popRP ll le lr of
UBT2(l_,e) -> case l_ of
Z _ _ _ -> spliceHL l_ DECINT1(hl) e r hr
_ -> UBT2(Z l_ e r, INCINT1(hr))
GT -> case r of
E -> UBT2(l,hl)
N rl re rr -> case popLN rl re rr of
UBT2(e,r_) -> case r_ of
Z _ _ _ -> spliceHR l hl e r_ DECINT1(hr)
_ -> spliceHR l hl e r_ hr
Z rl re rr -> case popLZ rl re rr of
UBT2(e,r_) -> case r_ of
E -> pushHR_ l hl r
_ -> spliceHR l hl e r_ hr
P rl re rr -> case popLP rl re rr of
UBT2(e,r_) -> case r_ of
Z _ _ _ -> spliceHR l hl e r_ DECINT1(hr)
_ -> spliceHR l hl e r_ hr
spliceH :: AVL e -> UINT -> e -> AVL e -> UINT -> UBT2(AVL e,UINT)
spliceH l hl b r hr =
case COMPAREUINT hl hr of
LT -> spliceHL l hl b r hr
EQ -> UBT2(Z l b r, INCINT1(hl))
GT -> spliceHR l hl b r hr
spliceHL :: AVL e -> UINT -> e -> AVL e -> UINT -> UBT2(AVL e,UINT)
spliceHL l hl b r hr = let d = SUBINT(hr,hl)
in if d EQL L(1) then UBT2(N l b r, INCINT1(hr))
else spliceHL_ hr d l b r
spliceHR :: AVL e -> UINT -> e -> AVL e -> UINT -> UBT2(AVL e,UINT)
spliceHR l hl b r hr = let d = SUBINT(hl,hr)
in if d EQL L(1) then UBT2(P l b r, INCINT1(hl))
else spliceHR_ hl d l b r
spliceHL_ :: UINT -> UINT -> AVL e -> e -> AVL e -> UBT2(AVL e,UINT)
spliceHL_ _ _ _ _ E = error "spliceHL_: Bug0"
spliceHL_ hr d l b (N rl re rr) = let r_ = spliceLN l b DECINT2(d) rl re rr
in r_ `seq` UBT2(r_,hr)
spliceHL_ hr d l b (Z rl re rr) = let r_ = spliceLZ l b DECINT1(d) rl re rr
in case r_ of
E -> error "spliceHL_: Bug1"
Z _ _ _ -> UBT2(r_, hr )
_ -> UBT2(r_,INCINT1(hr))
spliceHL_ hr d l b (P rl re rr) = let r_ = spliceLP l b DECINT1(d) rl re rr
in r_ `seq` UBT2(r_,hr)
spliceHR_ :: UINT -> UINT -> AVL e -> e -> AVL e -> UBT2(AVL e,UINT)
spliceHR_ _ _ E _ _ = error "spliceHR_: Bug0"
spliceHR_ hl d (N ll le lr) b r = let l_ = spliceRN r b DECINT1(d) ll le lr
in l_ `seq` UBT2(l_,hl)
spliceHR_ hl d (Z ll le lr) b r = let l_ = spliceRZ r b DECINT1(d) ll le lr
in case l_ of
E -> error "spliceHR_: Bug1"
Z _ _ _ -> UBT2(l_, hl )
_ -> UBT2(l_,INCINT1(hl))
spliceHR_ hl d (P ll le lr) b r = let l_ = spliceRP r b DECINT2(d) ll le lr
in l_ `seq` UBT2(l_,hl)
spliceL :: AVL e -> e -> UINT -> AVL e -> AVL e
spliceL s b L(0) r = Z s b r
spliceL s b L(1) r = N s b r
spliceL s b d (N rl re rr) = spliceLN s b DECINT2(d) rl re rr
spliceL s b d (Z rl re rr) = spliceLZ s b DECINT1(d) rl re rr
spliceL s b d (P rl re rr) = spliceLP s b DECINT1(d) rl re rr
spliceL _ _ _ E = error "spliceL: Bug0"
spliceLN :: AVL e -> e -> UINT -> AVL e -> e -> AVL e -> AVL e
spliceLN s b L(0) l e r = Z (Z s b l) e r
spliceLN s b L(1) l e r = Z (N s b l) e r
spliceLN s b d (N ll le lr) e r = let l_ = spliceLN s b DECINT2(d) ll le lr in l_ `seq` N l_ e r
spliceLN s b d (Z ll le lr) e r = let l_ = spliceLZ s b DECINT1(d) ll le lr
in case l_ of
Z _ _ _ -> N l_ e r
P _ _ _ -> Z l_ e r
_ -> error "spliceLN: Bug0"
spliceLN s b d (P ll le lr) e r = let l_ = spliceLP s b DECINT1(d) ll le lr in l_ `seq` N l_ e r
spliceLN _ _ _ E _ _ = error "spliceLN: Bug1"
spliceLZ :: AVL e -> e -> UINT -> AVL e -> e -> AVL e -> AVL e
spliceLZ s b L(1) l e r = P (N s b l) e r
spliceLZ s b d (N ll le lr) e r = let l_ = spliceLN s b DECINT2(d) ll le lr in l_ `seq` Z l_ e r
spliceLZ s b d (Z ll le lr) e r = let l_ = spliceLZ s b DECINT1(d) ll le lr
in case l_ of
Z _ _ _ -> Z l_ e r
P _ _ _ -> P l_ e r
_ -> error "spliceLZ: Bug0"
spliceLZ s b d (P ll le lr) e r = let l_ = spliceLP s b DECINT1(d) ll le lr in l_ `seq` Z l_ e r
spliceLZ _ _ _ E _ _ = error "spliceLZ: Bug1"
spliceLP :: AVL e -> e -> UINT -> AVL e -> e -> AVL e -> AVL e
spliceLP s b L(1) (N ll le lr) e r = Z (P s b ll) le (Z lr e r)
spliceLP s b L(1) (Z ll le lr) e r = Z (Z s b ll) le (Z lr e r)
spliceLP s b L(1) (P ll le lr) e r = Z (Z s b ll) le (N lr e r)
spliceLP s b d (N ll le lr) e r = let l_ = spliceLN s b DECINT2(d) ll le lr in l_ `seq` P l_ e r
spliceLP s b d (Z ll le lr) e r = spliceLPZ s b DECINT1(d) ll le lr e r
spliceLP s b d (P ll le lr) e r = let l_ = spliceLP s b DECINT1(d) ll le lr in l_ `seq` P l_ e r
spliceLP _ _ _ E _ _ = error "spliceLP: Bug0"
spliceLPZ :: AVL e -> e -> UINT -> AVL e -> e -> AVL e -> e -> AVL e -> AVL e
spliceLPZ s b L(1) ll le lr e r = Z (N s b ll) le (Z lr e r)
spliceLPZ s b d (N lll lle llr) le lr e r = let ll_ = spliceLN s b DECINT2(d) lll lle llr
in ll_ `seq` P (Z ll_ le lr) e r
spliceLPZ s b d (Z lll lle llr) le lr e r = let ll_ = spliceLZ s b DECINT1(d) lll lle llr
in case ll_ of
Z _ _ _ -> P (Z ll_ le lr) e r
P _ _ _ -> Z ll_ le (Z lr e r)
_ -> error "spliceLPZ: Bug0"
spliceLPZ s b d (P lll lle llr) le lr e r = let ll_ = spliceLP s b DECINT1(d) lll lle llr
in ll_ `seq` P (Z ll_ le lr) e r
spliceLPZ _ _ _ E _ _ _ _ = error "spliceLPZ: Bug1"
spliceR :: AVL e -> e -> UINT -> AVL e -> AVL e
spliceR s b L(0) l = Z l b s
spliceR s b L(1) l = P l b s
spliceR s b d (N ll le lr) = spliceRN s b DECINT1(d) ll le lr
spliceR s b d (Z ll le lr) = spliceRZ s b DECINT1(d) ll le lr
spliceR s b d (P ll le lr) = spliceRP s b DECINT2(d) ll le lr
spliceR _ _ _ E = error "spliceR: Bug0"
spliceRP :: AVL e -> e -> UINT -> AVL e -> e -> AVL e -> AVL e
spliceRP s b L(0) l e r = Z l e (Z r b s)
spliceRP s b L(1) l e r = Z l e (P r b s)
spliceRP s b d l e (N rl re rr) = let r_ = spliceRN s b DECINT1(d) rl re rr in r_ `seq` P l e r_
spliceRP s b d l e (Z rl re rr) = let r_ = spliceRZ s b DECINT1(d) rl re rr
in case r_ of
Z _ _ _ -> P l e r_
N _ _ _ -> Z l e r_
_ -> error "spliceRP: Bug0"
spliceRP s b d l e (P rl re rr) = let r_ = spliceRP s b DECINT2(d) rl re rr in r_ `seq` P l e r_
spliceRP _ _ _ _ _ E = error "spliceRP: Bug1"
spliceRZ :: AVL e -> e -> UINT -> AVL e -> e -> AVL e -> AVL e
spliceRZ s b L(1) l e r = N l e (P r b s)
spliceRZ s b d l e (N rl re rr) = let r_ = spliceRN s b DECINT1(d) rl re rr in r_ `seq` Z l e r_
spliceRZ s b d l e (Z rl re rr) = let r_ = spliceRZ s b DECINT1(d) rl re rr
in case r_ of
Z _ _ _ -> Z l e r_
N _ _ _ -> N l e r_
_ -> error "spliceRZ: Bug0"
spliceRZ s b d l e (P rl re rr) = let r_ = spliceRP s b DECINT2(d) rl re rr in r_ `seq` Z l e r_
spliceRZ _ _ _ _ _ E = error "spliceRZ: Bug1"
spliceRN :: AVL e -> e -> UINT -> AVL e -> e -> AVL e -> AVL e
spliceRN s b L(1) l e (N rl re rr) = Z (P l e rl) re (Z rr b s)
spliceRN s b L(1) l e (Z rl re rr) = Z (Z l e rl) re (Z rr b s)
spliceRN s b L(1) l e (P rl re rr) = Z (Z l e rl) re (N rr b s)
spliceRN s b d l e (N rl re rr) = let r_ = spliceRN s b DECINT1(d) rl re rr in r_ `seq` N l e r_
spliceRN s b d l e (Z rl re rr) = spliceRNZ s b DECINT1(d) l e rl re rr
spliceRN s b d l e (P rl re rr) = let r_ = spliceRP s b DECINT2(d) rl re rr in r_ `seq` N l e r_
spliceRN _ _ _ _ _ E = error "spliceRN: Bug0"
spliceRNZ :: AVL e -> e -> UINT -> AVL e -> e -> AVL e -> e -> AVL e -> AVL e
spliceRNZ s b L(1) l e rl re rr = Z (Z l e rl) re (P rr b s)
spliceRNZ s b d l e rl re (N rrl rre rrr) = let rr_ = spliceRN s b DECINT1(d) rrl rre rrr
in rr_ `seq` N l e (Z rl re rr_)
spliceRNZ s b d l e rl re (Z rrl rre rrr) = let rr_ = spliceRZ s b DECINT1(d) rrl rre rrr
in case rr_ of
Z _ _ _ -> N l e (Z rl re rr_)
N _ _ _ -> Z (Z l e rl) re rr_
_ -> error "spliceRNZ: Bug0"
spliceRNZ s b d l e rl re (P rrl rre rrr) = let rr_ = spliceRP s b DECINT2(d) rrl rre rrr
in rr_ `seq` N l e (Z rl re rr_)
spliceRNZ _ _ _ _ _ _ _ E = error "spliceRNZ: Bug1"