{-# OPTIONS_HADDOCK hide #-}
module Data.Tree.AVL.Zipper
(
ZAVL,PAVL,
assertOpenL,assertOpenR,
tryOpenL,tryOpenR,
assertOpen,tryOpen,
tryOpenGE,tryOpenLE,
openEither,
close,fillClose,
getCurrent,putCurrent,applyCurrent,applyCurrent',
assertMoveL,assertMoveR,tryMoveL,tryMoveR,
insertL,insertR,insertMoveL,insertMoveR,fill,
delClose,
assertDelMoveL,assertDelMoveR,tryDelMoveR,tryDelMoveL,
delAllL,delAllR,
delAllCloseL,delAllCloseR,
delAllIncCloseL,delAllIncCloseR,
insertTreeL,insertTreeR,
isLeftmost,isRightmost,
sizeL,sizeR,
sizeZAVL,
BAVL,
openBAVL,closeBAVL,
fullBAVL,emptyBAVL,tryReadBAVL,readFullBAVL,
pushBAVL,deleteBAVL,
fullBAVLtoZAVL,emptyBAVLtoPAVL,anyBAVLtoEither,
) where
import Prelude
import Data.Tree.AVL.Internals.Types(AVL(..))
import Data.Tree.AVL.Size(size,addSize)
import Data.Tree.AVL.Height(height,addHeight)
import Data.Tree.AVL.Internals.DelUtils(deletePath,popRN,popRZ,popRP,popLN,popLZ,popLP)
import Data.Tree.AVL.Internals.HJoin(spliceH,joinH)
import Data.Tree.AVL.Internals.HPush(pushHL,pushHR)
import Data.Tree.AVL.BinPath(BinPath(..),openPath,writePath,insertPath,sel,goL,goR)
import GHC.Base
#include "ghcdefs.h"
data ZAVL e = ZAVL (Path e) (AVL e) !UINT e (AVL e) !UINT
data PAVL e = PAVL (Path e) !UINT
data Path e = EP
| LP (Path e) e (AVL e) !UINT
| RP (Path e) e (AVL e) !UINT
close_ :: Path e -> AVL e -> UINT -> AVL e
close_ :: forall e. Path e -> AVL e -> Int# -> AVL e
close_ Path e
EP AVL e
t Int#
_ = AVL e
t
close_ (LP Path e
p e
e AVL e
r Int#
hr) AVL e
l Int#
hl = case AVL e -> Int# -> e -> AVL e -> Int# -> (# AVL e, Int# #)
forall e. AVL e -> Int# -> e -> AVL e -> Int# -> (# AVL e, Int# #)
spliceH AVL e
l Int#
hl e
e AVL e
r Int#
hr of UBT2(t,ht) -> Path e -> AVL e -> Int# -> AVL e
forall e. Path e -> AVL e -> Int# -> AVL e
close_ Path e
p AVL e
t Int#
ht
close_ (RP Path e
p e
e AVL e
l Int#
hl) AVL e
r Int#
hr = case AVL e -> Int# -> e -> AVL e -> Int# -> (# AVL e, Int# #)
forall e. AVL e -> Int# -> e -> AVL e -> Int# -> (# AVL e, Int# #)
spliceH AVL e
l Int#
hl e
e AVL e
r Int#
hr of UBT2(t,ht) -> Path e -> AVL e -> Int# -> AVL e
forall e. Path e -> AVL e -> Int# -> AVL e
close_ Path e
p AVL e
t Int#
ht
noLP :: Path e -> Path e
noLP :: forall e. Path e -> Path e
noLP Path e
EP = Path e
forall e. Path e
EP
noLP (LP Path e
p e
_ AVL e
_ Int#
_ ) = Path e -> Path e
forall e. Path e -> Path e
noLP Path e
p
noLP (RP Path e
p e
e AVL e
l Int#
hl) = let p_ :: Path e
p_ = Path e -> Path e
forall e. Path e -> Path e
noLP Path e
p in Path e
p_ Path e -> Path e -> Path e
forall a b. a -> b -> b
`seq` Path e -> e -> AVL e -> Int# -> Path e
forall e. Path e -> e -> AVL e -> Int# -> Path e
RP Path e
p_ e
e AVL e
l Int#
hl
noRP :: Path e -> Path e
noRP :: forall e. Path e -> Path e
noRP Path e
EP = Path e
forall e. Path e
EP
noRP (LP Path e
p e
e AVL e
r Int#
hr) = let p_ :: Path e
p_ = Path e -> Path e
forall e. Path e -> Path e
noRP Path e
p in Path e
p_ Path e -> Path e -> Path e
forall a b. a -> b -> b
`seq` Path e -> e -> AVL e -> Int# -> Path e
forall e. Path e -> e -> AVL e -> Int# -> Path e
LP Path e
p_ e
e AVL e
r Int#
hr
noRP (RP Path e
p e
_ AVL e
_ Int#
_ ) = Path e -> Path e
forall e. Path e -> Path e
noRP Path e
p
closeNoLP :: Path e -> AVL e -> UINT -> AVL e
closeNoLP :: forall e. Path e -> AVL e -> Int# -> AVL e
closeNoLP Path e
EP AVL e
t Int#
_ = AVL e
t
closeNoLP (LP Path e
p e
_ AVL e
_ Int#
_ ) AVL e
l Int#
hl = Path e -> AVL e -> Int# -> AVL e
forall e. Path e -> AVL e -> Int# -> AVL e
closeNoLP Path e
p AVL e
l Int#
hl
closeNoLP (RP Path e
p e
e AVL e
l Int#
hl) AVL e
r Int#
hr = case AVL e -> Int# -> e -> AVL e -> Int# -> (# AVL e, Int# #)
forall e. AVL e -> Int# -> e -> AVL e -> Int# -> (# AVL e, Int# #)
spliceH AVL e
l Int#
hl e
e AVL e
r Int#
hr of UBT2(t,ht) -> Path e -> AVL e -> Int# -> AVL e
forall e. Path e -> AVL e -> Int# -> AVL e
closeNoLP Path e
p AVL e
t Int#
ht
closeNoRP :: Path e -> AVL e -> UINT -> AVL e
closeNoRP :: forall e. Path e -> AVL e -> Int# -> AVL e
closeNoRP Path e
EP AVL e
t Int#
_ = AVL e
t
closeNoRP (LP Path e
p e
e AVL e
r Int#
hr) AVL e
l Int#
hl = case AVL e -> Int# -> e -> AVL e -> Int# -> (# AVL e, Int# #)
forall e. AVL e -> Int# -> e -> AVL e -> Int# -> (# AVL e, Int# #)
spliceH AVL e
l Int#
hl e
e AVL e
r Int#
hr of UBT2(t,ht) -> Path e -> AVL e -> Int# -> AVL e
forall e. Path e -> AVL e -> Int# -> AVL e
closeNoRP Path e
p AVL e
t Int#
ht
closeNoRP (RP Path e
p e
_ AVL e
_ Int#
_ ) AVL e
r Int#
hr = Path e -> AVL e -> Int# -> AVL e
forall e. Path e -> AVL e -> Int# -> AVL e
closeNoRP Path e
p AVL e
r Int#
hr
addSizeP :: Int -> Path e -> Int
addSizeP :: forall e. Int -> Path e -> Int
addSizeP Int
n Path e
EP = Int
n
addSizeP Int
n (LP Path e
p e
_ AVL e
r Int#
_) = Int -> Path e -> Int
forall e. Int -> Path e -> Int
addSizeP (Int -> AVL e -> Int
forall e. Int -> AVL e -> Int
addSize (Int
nInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
1) AVL e
r) Path e
p
addSizeP Int
n (RP Path e
p e
_ AVL e
l Int#
_) = Int -> Path e -> Int
forall e. Int -> Path e -> Int
addSizeP (Int -> AVL e -> Int
forall e. Int -> AVL e -> Int
addSize (Int
nInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
1) AVL e
l) Path e
p
addSizeRP :: Int -> Path e -> Int
addSizeRP :: forall e. Int -> Path e -> Int
addSizeRP Int
n Path e
EP = Int
n
addSizeRP Int
n (LP Path e
p e
_ AVL e
_ Int#
_) = Int -> Path e -> Int
forall e. Int -> Path e -> Int
addSizeRP Int
n Path e
p
addSizeRP Int
n (RP Path e
p e
_ AVL e
l Int#
_) = Int -> Path e -> Int
forall e. Int -> Path e -> Int
addSizeRP (Int -> AVL e -> Int
forall e. Int -> AVL e -> Int
addSize (Int
nInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
1) AVL e
l) Path e
p
addSizeLP :: Int -> Path e -> Int
addSizeLP :: forall e. Int -> Path e -> Int
addSizeLP Int
n Path e
EP = Int
n
addSizeLP Int
n (LP Path e
p e
_ AVL e
r Int#
_) = Int -> Path e -> Int
forall e. Int -> Path e -> Int
addSizeLP (Int -> AVL e -> Int
forall e. Int -> AVL e -> Int
addSize (Int
nInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
1) AVL e
r) Path e
p
addSizeLP Int
n (RP Path e
p e
_ AVL e
_ Int#
_) = Int -> Path e -> Int
forall e. Int -> Path e -> Int
addSizeLP Int
n Path e
p
assertOpen :: (e -> Ordering) -> AVL e -> ZAVL e
assertOpen :: forall e. (e -> Ordering) -> AVL e -> ZAVL e
assertOpen e -> Ordering
c AVL e
t = Path e -> Int# -> AVL e -> ZAVL e
op Path e
forall e. Path e
EP L(0AVL e
) t where
op :: Path e -> Int# -> AVL e -> ZAVL e
op Path e
_ Int#
_ AVL e
E = [Char] -> ZAVL e
forall a. HasCallStack => [Char] -> a
error [Char]
"assertOpen: No matching element."
op Path e
p Int#
h (N AVL e
l e
e AVL e
r) = case e -> Ordering
c e
e of
Ordering
LT -> let p_ :: Path e
p_ = Path e -> e -> AVL e -> Int# -> Path e
forall e. Path e -> e -> AVL e -> Int# -> Path e
LP Path e
p e
e AVL e
r DECINT1(h) in p_ `seq` op p_ DECINT2(hAVL e
) l
Ordering
EQ -> Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
forall e. Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
ZAVL Path e
p AVL e
l DECINT2(h) e r DECINT1(h)
Ordering
GT -> let p_ :: Path e
p_ = Path e -> e -> AVL e -> Int# -> Path e
forall e. Path e -> e -> AVL e -> Int# -> Path e
RP Path e
p e
e AVL e
l DECINT2(h) in p_ `seq` op p_ DECINT1(hAVL e
) r
op Path e
p Int#
h (Z AVL e
l e
e AVL e
r) = case e -> Ordering
c e
e of
Ordering
LT -> let p_ :: Path e
p_ = Path e -> e -> AVL e -> Int# -> Path e
forall e. Path e -> e -> AVL e -> Int# -> Path e
LP Path e
p e
e AVL e
r DECINT1(h) in p_ `seq` op p_ DECINT1(hAVL e
) l
Ordering
EQ -> Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
forall e. Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
ZAVL Path e
p AVL e
l DECINT1(h) e r DECINT1(h)
Ordering
GT -> let p_ :: Path e
p_ = Path e -> e -> AVL e -> Int# -> Path e
forall e. Path e -> e -> AVL e -> Int# -> Path e
RP Path e
p e
e AVL e
l DECINT1(h) in p_ `seq` op p_ DECINT1(hAVL e
) r
op Path e
p Int#
h (P AVL e
l e
e AVL e
r) = case e -> Ordering
c e
e of
Ordering
LT -> let p_ :: Path e
p_ = Path e -> e -> AVL e -> Int# -> Path e
forall e. Path e -> e -> AVL e -> Int# -> Path e
LP Path e
p e
e AVL e
r DECINT2(h) in p_ `seq` op p_ DECINT1(hAVL e
) l
Ordering
EQ -> Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
forall e. Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
ZAVL Path e
p AVL e
l DECINT1(h) e r DECINT2(h)
Ordering
GT -> let p_ :: Path e
p_ = Path e -> e -> AVL e -> Int# -> Path e
forall e. Path e -> e -> AVL e -> Int# -> Path e
RP Path e
p e
e AVL e
l DECINT1(h) in p_ `seq` op p_ DECINT2(hAVL e
) r
tryOpen :: (e -> Ordering) -> AVL e -> Maybe (ZAVL e)
tryOpen :: forall e. (e -> Ordering) -> AVL e -> Maybe (ZAVL e)
tryOpen e -> Ordering
c AVL e
t = Path e -> Int# -> AVL e -> Maybe (ZAVL e)
op Path e
forall e. Path e
EP L(0AVL e
) t where
op :: Path e -> Int# -> AVL e -> Maybe (ZAVL e)
op Path e
_ Int#
_ AVL e
E = Maybe (ZAVL e)
forall a. Maybe a
Nothing
op Path e
p Int#
h (N AVL e
l e
e AVL e
r) = case e -> Ordering
c e
e of
Ordering
LT -> let p_ :: Path e
p_ = Path e -> e -> AVL e -> Int# -> Path e
forall e. Path e -> e -> AVL e -> Int# -> Path e
LP Path e
p e
e AVL e
r DECINT1(h) in p_ `seq` op p_ DECINT2(hAVL e
) l
Ordering
EQ -> ZAVL e -> Maybe (ZAVL e)
forall a. a -> Maybe a
Just (ZAVL e -> Maybe (ZAVL e)) -> ZAVL e -> Maybe (ZAVL e)
forall a b. (a -> b) -> a -> b
$! Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
forall e. Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
ZAVL Path e
p AVL e
l DECINT2(h) e r DECINT1(h)
Ordering
GT -> let p_ :: Path e
p_ = Path e -> e -> AVL e -> Int# -> Path e
forall e. Path e -> e -> AVL e -> Int# -> Path e
RP Path e
p e
e AVL e
l DECINT2(h) in p_ `seq` op p_ DECINT1(hAVL e
) r
op Path e
p Int#
h (Z AVL e
l e
e AVL e
r) = case e -> Ordering
c e
e of
Ordering
LT -> let p_ :: Path e
p_ = Path e -> e -> AVL e -> Int# -> Path e
forall e. Path e -> e -> AVL e -> Int# -> Path e
LP Path e
p e
e AVL e
r DECINT1(h) in p_ `seq` op p_ DECINT1(hAVL e
) l
Ordering
EQ -> ZAVL e -> Maybe (ZAVL e)
forall a. a -> Maybe a
Just (ZAVL e -> Maybe (ZAVL e)) -> ZAVL e -> Maybe (ZAVL e)
forall a b. (a -> b) -> a -> b
$! Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
forall e. Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
ZAVL Path e
p AVL e
l DECINT1(h) e r DECINT1(h)
Ordering
GT -> let p_ :: Path e
p_ = Path e -> e -> AVL e -> Int# -> Path e
forall e. Path e -> e -> AVL e -> Int# -> Path e
RP Path e
p e
e AVL e
l DECINT1(h) in p_ `seq` op p_ DECINT1(hAVL e
) r
op Path e
p Int#
h (P AVL e
l e
e AVL e
r) = case e -> Ordering
c e
e of
Ordering
LT -> let p_ :: Path e
p_ = Path e -> e -> AVL e -> Int# -> Path e
forall e. Path e -> e -> AVL e -> Int# -> Path e
LP Path e
p e
e AVL e
r DECINT2(h) in p_ `seq` op p_ DECINT1(hAVL e
) l
Ordering
EQ -> ZAVL e -> Maybe (ZAVL e)
forall a. a -> Maybe a
Just (ZAVL e -> Maybe (ZAVL e)) -> ZAVL e -> Maybe (ZAVL e)
forall a b. (a -> b) -> a -> b
$! Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
forall e. Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
ZAVL Path e
p AVL e
l DECINT1(h) e r DECINT2(h)
Ordering
GT -> let p_ :: Path e
p_ = Path e -> e -> AVL e -> Int# -> Path e
forall e. Path e -> e -> AVL e -> Int# -> Path e
RP Path e
p e
e AVL e
l DECINT1(h) in p_ `seq` op p_ DECINT2(hAVL e
) r
tryOpenGE :: (e -> Ordering) -> AVL e -> Maybe (ZAVL e)
tryOpenGE :: forall e. (e -> Ordering) -> AVL e -> Maybe (ZAVL e)
tryOpenGE e -> Ordering
c AVL e
t = Path e -> Int# -> AVL e -> Maybe (ZAVL e)
op Path e
forall e. Path e
EP L(0AVL e
) t where
op :: Path e -> Int# -> AVL e -> Maybe (ZAVL e)
op Path e
p Int#
h AVL e
E = Path e -> AVL e -> Int# -> Maybe (ZAVL e)
forall {e}. Path e -> AVL e -> Int# -> Maybe (ZAVL e)
backupR Path e
p AVL e
forall e. AVL e
E Int#
h where
backupR :: Path e -> AVL e -> Int# -> Maybe (ZAVL e)
backupR Path e
EP AVL e
_ Int#
_ = Maybe (ZAVL e)
forall a. Maybe a
Nothing
backupR (LP Path e
p_ e
e AVL e
r Int#
hr) AVL e
l Int#
hl = ZAVL e -> Maybe (ZAVL e)
forall a. a -> Maybe a
Just (ZAVL e -> Maybe (ZAVL e)) -> ZAVL e -> Maybe (ZAVL e)
forall a b. (a -> b) -> a -> b
$! Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
forall e. Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
ZAVL Path e
p_ AVL e
l Int#
hl e
e AVL e
r Int#
hr
backupR (RP Path e
p_ e
e AVL e
l Int#
hl) AVL e
r Int#
hr = case AVL e -> Int# -> e -> AVL e -> Int# -> (# AVL e, Int# #)
forall e. AVL e -> Int# -> e -> AVL e -> Int# -> (# AVL e, Int# #)
spliceH AVL e
l Int#
hl e
e AVL e
r Int#
hr of UBT2(t_,ht_) -> Path e -> AVL e -> Int# -> Maybe (ZAVL e)
backupR Path e
p_ AVL e
t_ Int#
ht_
op Path e
p Int#
h (N AVL e
l e
e AVL e
r) = case e -> Ordering
c e
e of
Ordering
LT -> let p_ :: Path e
p_ = Path e -> e -> AVL e -> Int# -> Path e
forall e. Path e -> e -> AVL e -> Int# -> Path e
LP Path e
p e
e AVL e
r DECINT1(h) in p_ `seq` op p_ DECINT2(hAVL e
) l
Ordering
EQ -> ZAVL e -> Maybe (ZAVL e)
forall a. a -> Maybe a
Just (ZAVL e -> Maybe (ZAVL e)) -> ZAVL e -> Maybe (ZAVL e)
forall a b. (a -> b) -> a -> b
$! Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
forall e. Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
ZAVL Path e
p AVL e
l DECINT2(h) e r DECINT1(h)
Ordering
GT -> let p_ :: Path e
p_ = Path e -> e -> AVL e -> Int# -> Path e
forall e. Path e -> e -> AVL e -> Int# -> Path e
RP Path e
p e
e AVL e
l DECINT2(h) in p_ `seq` op p_ DECINT1(hAVL e
) r
op Path e
p Int#
h (Z AVL e
l e
e AVL e
r) = case e -> Ordering
c e
e of
Ordering
LT -> let p_ :: Path e
p_ = Path e -> e -> AVL e -> Int# -> Path e
forall e. Path e -> e -> AVL e -> Int# -> Path e
LP Path e
p e
e AVL e
r DECINT1(h) in p_ `seq` op p_ DECINT1(hAVL e
) l
Ordering
EQ -> ZAVL e -> Maybe (ZAVL e)
forall a. a -> Maybe a
Just (ZAVL e -> Maybe (ZAVL e)) -> ZAVL e -> Maybe (ZAVL e)
forall a b. (a -> b) -> a -> b
$! Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
forall e. Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
ZAVL Path e
p AVL e
l DECINT1(h) e r DECINT1(h)
Ordering
GT -> let p_ :: Path e
p_ = Path e -> e -> AVL e -> Int# -> Path e
forall e. Path e -> e -> AVL e -> Int# -> Path e
RP Path e
p e
e AVL e
l DECINT1(h) in p_ `seq` op p_ DECINT1(hAVL e
) r
op Path e
p Int#
h (P AVL e
l e
e AVL e
r) = case e -> Ordering
c e
e of
Ordering
LT -> let p_ :: Path e
p_ = Path e -> e -> AVL e -> Int# -> Path e
forall e. Path e -> e -> AVL e -> Int# -> Path e
LP Path e
p e
e AVL e
r DECINT2(h) in p_ `seq` op p_ DECINT1(hAVL e
) l
Ordering
EQ -> ZAVL e -> Maybe (ZAVL e)
forall a. a -> Maybe a
Just (ZAVL e -> Maybe (ZAVL e)) -> ZAVL e -> Maybe (ZAVL e)
forall a b. (a -> b) -> a -> b
$! Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
forall e. Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
ZAVL Path e
p AVL e
l DECINT1(h) e r DECINT2(h)
Ordering
GT -> let p_ :: Path e
p_ = Path e -> e -> AVL e -> Int# -> Path e
forall e. Path e -> e -> AVL e -> Int# -> Path e
RP Path e
p e
e AVL e
l DECINT1(h) in p_ `seq` op p_ DECINT2(hAVL e
) r
tryOpenLE :: (e -> Ordering) -> AVL e -> Maybe (ZAVL e)
tryOpenLE :: forall e. (e -> Ordering) -> AVL e -> Maybe (ZAVL e)
tryOpenLE e -> Ordering
c AVL e
t = Path e -> Int# -> AVL e -> Maybe (ZAVL e)
op Path e
forall e. Path e
EP L(0AVL e
) t where
op :: Path e -> Int# -> AVL e -> Maybe (ZAVL e)
op Path e
p Int#
h AVL e
E = Path e -> AVL e -> Int# -> Maybe (ZAVL e)
forall {e}. Path e -> AVL e -> Int# -> Maybe (ZAVL e)
backupL Path e
p AVL e
forall e. AVL e
E Int#
h where
backupL :: Path e -> AVL e -> Int# -> Maybe (ZAVL e)
backupL Path e
EP AVL e
_ Int#
_ = Maybe (ZAVL e)
forall a. Maybe a
Nothing
backupL (LP Path e
p_ e
e AVL e
r Int#
hr) AVL e
l Int#
hl = case AVL e -> Int# -> e -> AVL e -> Int# -> (# AVL e, Int# #)
forall e. AVL e -> Int# -> e -> AVL e -> Int# -> (# AVL e, Int# #)
spliceH AVL e
l Int#
hl e
e AVL e
r Int#
hr of UBT2(t_,ht_) -> Path e -> AVL e -> Int# -> Maybe (ZAVL e)
backupL Path e
p_ AVL e
t_ Int#
ht_
backupL (RP Path e
p_ e
e AVL e
l Int#
hl) AVL e
r Int#
hr = ZAVL e -> Maybe (ZAVL e)
forall a. a -> Maybe a
Just (ZAVL e -> Maybe (ZAVL e)) -> ZAVL e -> Maybe (ZAVL e)
forall a b. (a -> b) -> a -> b
$! Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
forall e. Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
ZAVL Path e
p_ AVL e
l Int#
hl e
e AVL e
r Int#
hr
op Path e
p Int#
h (N AVL e
l e
e AVL e
r) = case e -> Ordering
c e
e of
Ordering
LT -> let p_ :: Path e
p_ = Path e -> e -> AVL e -> Int# -> Path e
forall e. Path e -> e -> AVL e -> Int# -> Path e
LP Path e
p e
e AVL e
r DECINT1(h) in p_ `seq` op p_ DECINT2(hAVL e
) l
Ordering
EQ -> ZAVL e -> Maybe (ZAVL e)
forall a. a -> Maybe a
Just (ZAVL e -> Maybe (ZAVL e)) -> ZAVL e -> Maybe (ZAVL e)
forall a b. (a -> b) -> a -> b
$! Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
forall e. Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
ZAVL Path e
p AVL e
l DECINT2(h) e r DECINT1(h)
Ordering
GT -> let p_ :: Path e
p_ = Path e -> e -> AVL e -> Int# -> Path e
forall e. Path e -> e -> AVL e -> Int# -> Path e
RP Path e
p e
e AVL e
l DECINT2(h) in p_ `seq` op p_ DECINT1(hAVL e
) r
op Path e
p Int#
h (Z AVL e
l e
e AVL e
r) = case e -> Ordering
c e
e of
Ordering
LT -> let p_ :: Path e
p_ = Path e -> e -> AVL e -> Int# -> Path e
forall e. Path e -> e -> AVL e -> Int# -> Path e
LP Path e
p e
e AVL e
r DECINT1(h) in p_ `seq` op p_ DECINT1(hAVL e
) l
Ordering
EQ -> ZAVL e -> Maybe (ZAVL e)
forall a. a -> Maybe a
Just (ZAVL e -> Maybe (ZAVL e)) -> ZAVL e -> Maybe (ZAVL e)
forall a b. (a -> b) -> a -> b
$! Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
forall e. Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
ZAVL Path e
p AVL e
l DECINT1(h) e r DECINT1(h)
Ordering
GT -> let p_ :: Path e
p_ = Path e -> e -> AVL e -> Int# -> Path e
forall e. Path e -> e -> AVL e -> Int# -> Path e
RP Path e
p e
e AVL e
l DECINT1(h) in p_ `seq` op p_ DECINT1(hAVL e
) r
op Path e
p Int#
h (P AVL e
l e
e AVL e
r) = case e -> Ordering
c e
e of
Ordering
LT -> let p_ :: Path e
p_ = Path e -> e -> AVL e -> Int# -> Path e
forall e. Path e -> e -> AVL e -> Int# -> Path e
LP Path e
p e
e AVL e
r DECINT2(h) in p_ `seq` op p_ DECINT1(hAVL e
) l
Ordering
EQ -> ZAVL e -> Maybe (ZAVL e)
forall a. a -> Maybe a
Just (ZAVL e -> Maybe (ZAVL e)) -> ZAVL e -> Maybe (ZAVL e)
forall a b. (a -> b) -> a -> b
$! Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
forall e. Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
ZAVL Path e
p AVL e
l DECINT1(h) e r DECINT2(h)
Ordering
GT -> let p_ :: Path e
p_ = Path e -> e -> AVL e -> Int# -> Path e
forall e. Path e -> e -> AVL e -> Int# -> Path e
RP Path e
p e
e AVL e
l DECINT1(h) in p_ `seq` op p_ DECINT2(hAVL e
) r
assertOpenL :: AVL e -> ZAVL e
assertOpenL :: forall e. AVL e -> ZAVL e
assertOpenL AVL e
E = [Char] -> ZAVL e
forall a. HasCallStack => [Char] -> a
error [Char]
"assertOpenL: Empty tree."
assertOpenL (N AVL e
l e
e AVL e
r) = Path e -> Int# -> AVL e -> e -> AVL e -> ZAVL e
forall e. Path e -> Int# -> AVL e -> e -> AVL e -> ZAVL e
openLN Path e
forall e. Path e
EP L(0AVL e
) e
l AVL e
e r
assertOpenL (Z AVL e
l e
e AVL e
r) = Path e -> Int# -> AVL e -> e -> AVL e -> ZAVL e
forall e. Path e -> Int# -> AVL e -> e -> AVL e -> ZAVL e
openLZ Path e
forall e. Path e
EP L(0AVL e
) e
l AVL e
e r
assertOpenL (P AVL e
l e
e AVL e
r) = Path e -> Int# -> AVL e -> ZAVL e
forall e. Path e -> Int# -> AVL e -> ZAVL e
openL_ (Path e -> e -> AVL e -> Int# -> Path e
forall e. Path e -> e -> AVL e -> Int# -> Path e
LP Path e
forall e. Path e
EP e
e AVL e
r L(0)) LAVL e
(1) l
tryOpenL :: AVL e -> Maybe (ZAVL e)
tryOpenL :: forall e. AVL e -> Maybe (ZAVL e)
tryOpenL AVL e
E = Maybe (ZAVL e)
forall a. Maybe a
Nothing
tryOpenL (N AVL e
l e
e AVL e
r) = ZAVL e -> Maybe (ZAVL e)
forall a. a -> Maybe a
Just (ZAVL e -> Maybe (ZAVL e)) -> ZAVL e -> Maybe (ZAVL e)
forall a b. (a -> b) -> a -> b
$! Path e -> Int# -> AVL e -> e -> AVL e -> ZAVL e
forall e. Path e -> Int# -> AVL e -> e -> AVL e -> ZAVL e
openLN Path e
forall e. Path e
EP L(0AVL e
) e
l AVL e
e r
tryOpenL (Z AVL e
l e
e AVL e
r) = ZAVL e -> Maybe (ZAVL e)
forall a. a -> Maybe a
Just (ZAVL e -> Maybe (ZAVL e)) -> ZAVL e -> Maybe (ZAVL e)
forall a b. (a -> b) -> a -> b
$! Path e -> Int# -> AVL e -> e -> AVL e -> ZAVL e
forall e. Path e -> Int# -> AVL e -> e -> AVL e -> ZAVL e
openLZ Path e
forall e. Path e
EP L(0AVL e
) e
l AVL e
e r
tryOpenL (P AVL e
l e
e AVL e
r) = ZAVL e -> Maybe (ZAVL e)
forall a. a -> Maybe a
Just (ZAVL e -> Maybe (ZAVL e)) -> ZAVL e -> Maybe (ZAVL e)
forall a b. (a -> b) -> a -> b
$! Path e -> Int# -> AVL e -> ZAVL e
forall e. Path e -> Int# -> AVL e -> ZAVL e
openL_ (Path e -> e -> AVL e -> Int# -> Path e
forall e. Path e -> e -> AVL e -> Int# -> Path e
LP Path e
forall e. Path e
EP e
e AVL e
r L(0)) LAVL e
(1) l
openL_ :: (Path e) -> UINT -> AVL e -> ZAVL e
openL_ :: forall e. Path e -> Int# -> AVL e -> ZAVL e
openL_ Path e
_ Int#
_ AVL e
E = [Char] -> ZAVL e
forall a. HasCallStack => [Char] -> a
error [Char]
"openL_: Bug0"
openL_ Path e
p Int#
h (N AVL e
l e
e AVL e
r) = Path e -> Int# -> AVL e -> e -> AVL e -> ZAVL e
forall e. Path e -> Int# -> AVL e -> e -> AVL e -> ZAVL e
openLN Path e
p Int#
h AVL e
l e
e AVL e
r
openL_ Path e
p Int#
h (Z AVL e
l e
e AVL e
r) = Path e -> Int# -> AVL e -> e -> AVL e -> ZAVL e
forall e. Path e -> Int# -> AVL e -> e -> AVL e -> ZAVL e
openLZ Path e
p Int#
h AVL e
l e
e AVL e
r
openL_ Path e
p Int#
h (P AVL e
l e
e AVL e
r) = let p_ :: Path e
p_ = Path e -> e -> AVL e -> Int# -> Path e
forall e. Path e -> e -> AVL e -> Int# -> Path e
LP Path e
p e
e AVL e
r DECINT2(h) in p_ `seq` openL_ p_ DECINT1(hAVL e
) l
openLN :: (Path e) -> UINT -> AVL e -> e -> AVL e -> ZAVL e
openLN :: forall e. Path e -> Int# -> AVL e -> e -> AVL e -> ZAVL e
openLN Path e
p Int#
h AVL e
E e
e AVL e
r = Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
forall e. Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
ZAVL Path e
p AVL e
forall e. AVL e
E DECINT2(h) e r DECINT1(h)
openLN Path e
p Int#
h (N AVL e
ll e
le AVL e
lr) e
e AVL e
r = let p_ :: Path e
p_ = Path e -> e -> AVL e -> Int# -> Path e
forall e. Path e -> e -> AVL e -> Int# -> Path e
LP Path e
p e
e AVL e
r DECINT1(h) in p_ `seq` openLN p_ DECINT2(h) ll le lr
openLN Path e
p Int#
h (Z AVL e
ll e
le AVL e
lr) e
e AVL e
r = let p_ :: Path e
p_ = Path e -> e -> AVL e -> Int# -> Path e
forall e. Path e -> e -> AVL e -> Int# -> Path e
LP Path e
p e
e AVL e
r DECINT1(h) in p_ `seq` openLZ p_ DECINT2(h) ll le lr
openLN Path e
p Int#
h (P AVL e
ll e
le AVL e
lr) e
e AVL e
r = let p_ :: Path e
p_ = Path e -> e -> AVL e -> Int# -> Path e
forall e. Path e -> e -> AVL e -> Int# -> Path e
LP Path e
p e
e AVL e
r DECINT1(h)
p__ :: Path e
p__ = Path e
p_ Path e -> Path e -> Path e
forall a b. a -> b -> b
`seq` Path e -> e -> AVL e -> Int# -> Path e
forall e. Path e -> e -> AVL e -> Int# -> Path e
LP Path e
p_ e
le AVL e
lr DECINT4(h)
in Path e
p__ Path e -> ZAVL e -> ZAVL e
forall a b. a -> b -> b
`seq` Path e -> Int# -> AVL e -> ZAVL e
forall e. Path e -> Int# -> AVL e -> ZAVL e
openL_ Path e
p__ DECINT3(h) ll
openLZ :: (Path e) -> UINT -> AVL e -> e -> AVL e -> ZAVL e
openLZ :: forall e. Path e -> Int# -> AVL e -> e -> AVL e -> ZAVL e
openLZ Path e
p Int#
h AVL e
E e
e AVL e
r = Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
forall e. Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
ZAVL Path e
p AVL e
forall e. AVL e
E DECINT1(h) e r DECINT1(h)
openLZ Path e
p Int#
h (N AVL e
ll e
le AVL e
lr) e
e AVL e
r = let p_ :: Path e
p_ = Path e -> e -> AVL e -> Int# -> Path e
forall e. Path e -> e -> AVL e -> Int# -> Path e
LP Path e
p e
e AVL e
r DECINT1(h) in p_ `seq` openLN p_ DECINT1(h) ll le lr
openLZ Path e
p Int#
h (Z AVL e
ll e
le AVL e
lr) e
e AVL e
r = let p_ :: Path e
p_ = Path e -> e -> AVL e -> Int# -> Path e
forall e. Path e -> e -> AVL e -> Int# -> Path e
LP Path e
p e
e AVL e
r DECINT1(h) in p_ `seq` openLZ p_ DECINT1(h) ll le lr
openLZ Path e
p Int#
h (P AVL e
ll e
le AVL e
lr) e
e AVL e
r = let p_ :: Path e
p_ = Path e -> e -> AVL e -> Int# -> Path e
forall e. Path e -> e -> AVL e -> Int# -> Path e
LP Path e
p e
e AVL e
r DECINT1(h)
p__ :: Path e
p__ = Path e
p_ Path e -> Path e -> Path e
forall a b. a -> b -> b
`seq` Path e -> e -> AVL e -> Int# -> Path e
forall e. Path e -> e -> AVL e -> Int# -> Path e
LP Path e
p_ e
le AVL e
lr DECINT3(h)
in Path e
p__ Path e -> ZAVL e -> ZAVL e
forall a b. a -> b -> b
`seq` Path e -> Int# -> AVL e -> ZAVL e
forall e. Path e -> Int# -> AVL e -> ZAVL e
openL_ Path e
p__ DECINT2(h) ll
assertOpenR :: AVL e -> ZAVL e
assertOpenR :: forall e. AVL e -> ZAVL e
assertOpenR AVL e
E = [Char] -> ZAVL e
forall a. HasCallStack => [Char] -> a
error [Char]
"assertOpenR: Empty tree."
assertOpenR (N AVL e
l e
e AVL e
r) = Path e -> Int# -> AVL e -> ZAVL e
forall e. Path e -> Int# -> AVL e -> ZAVL e
openR_ (Path e -> e -> AVL e -> Int# -> Path e
forall e. Path e -> e -> AVL e -> Int# -> Path e
RP Path e
forall e. Path e
EP e
e AVL e
l L(0)) LAVL e
(1) r
assertOpenR (Z AVL e
l e
e AVL e
r) = Path e -> Int# -> AVL e -> e -> AVL e -> ZAVL e
forall e. Path e -> Int# -> AVL e -> e -> AVL e -> ZAVL e
openRZ Path e
forall e. Path e
EP L(0AVL e
) e
l AVL e
e r
assertOpenR (P AVL e
l e
e AVL e
r) = Path e -> Int# -> AVL e -> e -> AVL e -> ZAVL e
forall e. Path e -> Int# -> AVL e -> e -> AVL e -> ZAVL e
openRP Path e
forall e. Path e
EP L(0AVL e
) e
l AVL e
e r
tryOpenR :: AVL e -> Maybe (ZAVL e)
tryOpenR :: forall e. AVL e -> Maybe (ZAVL e)
tryOpenR AVL e
E = Maybe (ZAVL e)
forall a. Maybe a
Nothing
tryOpenR (N AVL e
l e
e AVL e
r) = ZAVL e -> Maybe (ZAVL e)
forall a. a -> Maybe a
Just (ZAVL e -> Maybe (ZAVL e)) -> ZAVL e -> Maybe (ZAVL e)
forall a b. (a -> b) -> a -> b
$! Path e -> Int# -> AVL e -> ZAVL e
forall e. Path e -> Int# -> AVL e -> ZAVL e
openR_ (Path e -> e -> AVL e -> Int# -> Path e
forall e. Path e -> e -> AVL e -> Int# -> Path e
RP Path e
forall e. Path e
EP e
e AVL e
l L(0)) LAVL e
(1) r
tryOpenR (Z AVL e
l e
e AVL e
r) = ZAVL e -> Maybe (ZAVL e)
forall a. a -> Maybe a
Just (ZAVL e -> Maybe (ZAVL e)) -> ZAVL e -> Maybe (ZAVL e)
forall a b. (a -> b) -> a -> b
$! Path e -> Int# -> AVL e -> e -> AVL e -> ZAVL e
forall e. Path e -> Int# -> AVL e -> e -> AVL e -> ZAVL e
openRZ Path e
forall e. Path e
EP L(0AVL e
) e
l AVL e
e r
tryOpenR (P AVL e
l e
e AVL e
r) = ZAVL e -> Maybe (ZAVL e)
forall a. a -> Maybe a
Just (ZAVL e -> Maybe (ZAVL e)) -> ZAVL e -> Maybe (ZAVL e)
forall a b. (a -> b) -> a -> b
$! Path e -> Int# -> AVL e -> e -> AVL e -> ZAVL e
forall e. Path e -> Int# -> AVL e -> e -> AVL e -> ZAVL e
openRP Path e
forall e. Path e
EP L(0AVL e
) e
l AVL e
e r
openR_ :: (Path e) -> UINT -> AVL e -> ZAVL e
openR_ :: forall e. Path e -> Int# -> AVL e -> ZAVL e
openR_ Path e
_ Int#
_ AVL e
E = [Char] -> ZAVL e
forall a. HasCallStack => [Char] -> a
error [Char]
"openR_: Bug0"
openR_ Path e
p Int#
h (N AVL e
l e
e AVL e
r) = let p_ :: Path e
p_ = Path e -> e -> AVL e -> Int# -> Path e
forall e. Path e -> e -> AVL e -> Int# -> Path e
RP Path e
p e
e AVL e
l DECINT2(h) in p_ `seq` openR_ p_ DECINT1(hAVL e
) r
openR_ Path e
p Int#
h (Z AVL e
l e
e AVL e
r) = Path e -> Int# -> AVL e -> e -> AVL e -> ZAVL e
forall e. Path e -> Int# -> AVL e -> e -> AVL e -> ZAVL e
openRZ Path e
p Int#
h AVL e
l e
e AVL e
r
openR_ Path e
p Int#
h (P AVL e
l e
e AVL e
r) = Path e -> Int# -> AVL e -> e -> AVL e -> ZAVL e
forall e. Path e -> Int# -> AVL e -> e -> AVL e -> ZAVL e
openRP Path e
p Int#
h AVL e
l e
e AVL e
r
openRP :: (Path e) -> UINT -> AVL e -> e -> AVL e -> ZAVL e
openRP :: forall e. Path e -> Int# -> AVL e -> e -> AVL e -> ZAVL e
openRP Path e
p Int#
h AVL e
l e
e AVL e
E = Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
forall e. Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
ZAVL Path e
p AVL e
l DECINT1(h) e E DECINT2(h)
openRP Path e
p Int#
h AVL e
l e
e (N AVL e
rl e
re AVL e
rr) = let p_ :: Path e
p_ = Path e -> e -> AVL e -> Int# -> Path e
forall e. Path e -> e -> AVL e -> Int# -> Path e
RP Path e
p e
e AVL e
l DECINT1(h)
p__ :: Path e
p__ = Path e
p_ Path e -> Path e -> Path e
forall a b. a -> b -> b
`seq` Path e -> e -> AVL e -> Int# -> Path e
forall e. Path e -> e -> AVL e -> Int# -> Path e
RP Path e
p_ e
re AVL e
rl DECINT4(h)
in Path e
p__ Path e -> ZAVL e -> ZAVL e
forall a b. a -> b -> b
`seq` Path e -> Int# -> AVL e -> ZAVL e
forall e. Path e -> Int# -> AVL e -> ZAVL e
openR_ Path e
p__ DECINT3(h) rr
openRP Path e
p Int#
h AVL e
l e
e (Z AVL e
rl e
re AVL e
rr) = let p_ :: Path e
p_ = Path e -> e -> AVL e -> Int# -> Path e
forall e. Path e -> e -> AVL e -> Int# -> Path e
RP Path e
p e
e AVL e
l DECINT1(h) in p_ `seq` openRZ p_ DECINT2(h) rl re rr
openRP Path e
p Int#
h AVL e
l e
e (P AVL e
rl e
re AVL e
rr) = let p_ :: Path e
p_ = Path e -> e -> AVL e -> Int# -> Path e
forall e. Path e -> e -> AVL e -> Int# -> Path e
RP Path e
p e
e AVL e
l DECINT1(h) in p_ `seq` openRP p_ DECINT2(h) rl re rr
openRZ :: (Path e) -> UINT -> AVL e -> e -> AVL e -> ZAVL e
openRZ :: forall e. Path e -> Int# -> AVL e -> e -> AVL e -> ZAVL e
openRZ Path e
p Int#
h AVL e
l e
e AVL e
E = Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
forall e. Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
ZAVL Path e
p AVL e
l DECINT1(h) e E DECINT1(h)
openRZ Path e
p Int#
h AVL e
l e
e (N AVL e
rl e
re AVL e
rr) = let p_ :: Path e
p_ = Path e -> e -> AVL e -> Int# -> Path e
forall e. Path e -> e -> AVL e -> Int# -> Path e
RP Path e
p e
e AVL e
l DECINT1(h)
p__ :: Path e
p__ = Path e
p_ Path e -> Path e -> Path e
forall a b. a -> b -> b
`seq` Path e -> e -> AVL e -> Int# -> Path e
forall e. Path e -> e -> AVL e -> Int# -> Path e
RP Path e
p_ e
re AVL e
rl DECINT3(h)
in Path e
p__ Path e -> ZAVL e -> ZAVL e
forall a b. a -> b -> b
`seq` Path e -> Int# -> AVL e -> ZAVL e
forall e. Path e -> Int# -> AVL e -> ZAVL e
openR_ Path e
p__ DECINT2(h) rr
openRZ Path e
p Int#
h AVL e
l e
e (Z AVL e
rl e
re AVL e
rr) = let p_ :: Path e
p_ = Path e -> e -> AVL e -> Int# -> Path e
forall e. Path e -> e -> AVL e -> Int# -> Path e
RP Path e
p e
e AVL e
l DECINT1(h) in p_ `seq` openRZ p_ DECINT1(h) rl re rr
openRZ Path e
p Int#
h AVL e
l e
e (P AVL e
rl e
re AVL e
rr) = let p_ :: Path e
p_ = Path e -> e -> AVL e -> Int# -> Path e
forall e. Path e -> e -> AVL e -> Int# -> Path e
RP Path e
p e
e AVL e
l DECINT1(h) in p_ `seq` openRP p_ DECINT1(h) rl re rr
openEither :: (e -> Ordering) -> AVL e -> Either (PAVL e) (ZAVL e)
openEither :: forall e. (e -> Ordering) -> AVL e -> Either (PAVL e) (ZAVL e)
openEither e -> Ordering
c AVL e
t = Path e -> Int# -> AVL e -> Either (PAVL e) (ZAVL e)
op Path e
forall e. Path e
EP L(0AVL e
) t where
op :: Path e -> Int# -> AVL e -> Either (PAVL e) (ZAVL e)
op Path e
p Int#
h AVL e
E = PAVL e -> Either (PAVL e) (ZAVL e)
forall a b. a -> Either a b
Left (PAVL e -> Either (PAVL e) (ZAVL e))
-> PAVL e -> Either (PAVL e) (ZAVL e)
forall a b. (a -> b) -> a -> b
$! Path e -> Int# -> PAVL e
forall e. Path e -> Int# -> PAVL e
PAVL Path e
p Int#
h
op Path e
p Int#
h (N AVL e
l e
e AVL e
r) = case e -> Ordering
c e
e of
Ordering
LT -> let p_ :: Path e
p_ = Path e -> e -> AVL e -> Int# -> Path e
forall e. Path e -> e -> AVL e -> Int# -> Path e
LP Path e
p e
e AVL e
r DECINT1(h) in p_ `seq` op p_ DECINT2(hAVL e
) l
Ordering
EQ -> ZAVL e -> Either (PAVL e) (ZAVL e)
forall a b. b -> Either a b
Right (ZAVL e -> Either (PAVL e) (ZAVL e))
-> ZAVL e -> Either (PAVL e) (ZAVL e)
forall a b. (a -> b) -> a -> b
$! Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
forall e. Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
ZAVL Path e
p AVL e
l DECINT2(h) e r DECINT1(h)
Ordering
GT -> let p_ :: Path e
p_ = Path e -> e -> AVL e -> Int# -> Path e
forall e. Path e -> e -> AVL e -> Int# -> Path e
RP Path e
p e
e AVL e
l DECINT2(h) in p_ `seq` op p_ DECINT1(hAVL e
) r
op Path e
p Int#
h (Z AVL e
l e
e AVL e
r) = case e -> Ordering
c e
e of
Ordering
LT -> let p_ :: Path e
p_ = Path e -> e -> AVL e -> Int# -> Path e
forall e. Path e -> e -> AVL e -> Int# -> Path e
LP Path e
p e
e AVL e
r DECINT1(h) in p_ `seq` op p_ DECINT1(hAVL e
) l
Ordering
EQ -> ZAVL e -> Either (PAVL e) (ZAVL e)
forall a b. b -> Either a b
Right (ZAVL e -> Either (PAVL e) (ZAVL e))
-> ZAVL e -> Either (PAVL e) (ZAVL e)
forall a b. (a -> b) -> a -> b
$! Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
forall e. Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
ZAVL Path e
p AVL e
l DECINT1(h) e r DECINT1(h)
Ordering
GT -> let p_ :: Path e
p_ = Path e -> e -> AVL e -> Int# -> Path e
forall e. Path e -> e -> AVL e -> Int# -> Path e
RP Path e
p e
e AVL e
l DECINT1(h) in p_ `seq` op p_ DECINT1(hAVL e
) r
op Path e
p Int#
h (P AVL e
l e
e AVL e
r) = case e -> Ordering
c e
e of
Ordering
LT -> let p_ :: Path e
p_ = Path e -> e -> AVL e -> Int# -> Path e
forall e. Path e -> e -> AVL e -> Int# -> Path e
LP Path e
p e
e AVL e
r DECINT2(h) in p_ `seq` op p_ DECINT1(hAVL e
) l
Ordering
EQ -> ZAVL e -> Either (PAVL e) (ZAVL e)
forall a b. b -> Either a b
Right (ZAVL e -> Either (PAVL e) (ZAVL e))
-> ZAVL e -> Either (PAVL e) (ZAVL e)
forall a b. (a -> b) -> a -> b
$! Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
forall e. Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
ZAVL Path e
p AVL e
l DECINT1(h) e r DECINT2(h)
Ordering
GT -> let p_ :: Path e
p_ = Path e -> e -> AVL e -> Int# -> Path e
forall e. Path e -> e -> AVL e -> Int# -> Path e
RP Path e
p e
e AVL e
l DECINT1(h) in p_ `seq` op p_ DECINT2(hAVL e
) r
fill :: e -> PAVL e -> ZAVL e
fill :: forall e. e -> PAVL e -> ZAVL e
fill e
e (PAVL Path e
p Int#
h) = Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
forall e. Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
ZAVL Path e
p AVL e
forall e. AVL e
E Int#
h e
e AVL e
forall e. AVL e
E Int#
h
fillClose :: e -> PAVL e -> AVL e
fillClose :: forall e. e -> PAVL e -> AVL e
fillClose e
e (PAVL Path e
p Int#
h) = Path e -> AVL e -> Int# -> AVL e
forall e. Path e -> AVL e -> Int# -> AVL e
close_ Path e
p (AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
Z AVL e
forall e. AVL e
E e
e AVL e
forall e. AVL e
E) INCINT1(h)
close :: ZAVL e -> AVL e
close :: forall e. ZAVL e -> AVL e
close (ZAVL Path e
p AVL e
l Int#
hl e
e AVL e
r Int#
hr) = case AVL e -> Int# -> e -> AVL e -> Int# -> (# AVL e, Int# #)
forall e. AVL e -> Int# -> e -> AVL e -> Int# -> (# AVL e, Int# #)
spliceH AVL e
l Int#
hl e
e AVL e
r Int#
hr of UBT2(t,ht) -> Path e -> AVL e -> Int# -> AVL e
forall e. Path e -> AVL e -> Int# -> AVL e
close_ Path e
p AVL e
t Int#
ht
delClose :: ZAVL e -> AVL e
delClose :: forall e. ZAVL e -> AVL e
delClose (ZAVL Path e
p AVL e
l Int#
hl e
_ AVL e
r Int#
hr) = case AVL e -> Int# -> AVL e -> Int# -> (# AVL e, Int# #)
forall e. AVL e -> Int# -> AVL e -> Int# -> (# AVL e, Int# #)
joinH AVL e
l Int#
hl AVL e
r Int#
hr of UBT2(t,ht) -> Path e -> AVL e -> Int# -> AVL e
forall e. Path e -> AVL e -> Int# -> AVL e
close_ Path e
p AVL e
t Int#
ht
getCurrent :: ZAVL e -> e
getCurrent :: forall e. ZAVL e -> e
getCurrent (ZAVL Path e
_ AVL e
_ Int#
_ e
e AVL e
_ Int#
_) = e
e
putCurrent :: e -> ZAVL e -> ZAVL e
putCurrent :: forall e. e -> ZAVL e -> ZAVL e
putCurrent e
e (ZAVL Path e
p AVL e
l Int#
hl e
_ AVL e
r Int#
hr) = Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
forall e. Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
ZAVL Path e
p AVL e
l Int#
hl e
e AVL e
r Int#
hr
applyCurrent :: (e -> e) -> ZAVL e -> ZAVL e
applyCurrent :: forall e. (e -> e) -> ZAVL e -> ZAVL e
applyCurrent e -> e
f (ZAVL Path e
p AVL e
l Int#
hl e
e AVL e
r Int#
hr) = Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
forall e. Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
ZAVL Path e
p AVL e
l Int#
hl (e -> e
f e
e) AVL e
r Int#
hr
applyCurrent' :: (e -> e) -> ZAVL e -> ZAVL e
applyCurrent' :: forall e. (e -> e) -> ZAVL e -> ZAVL e
applyCurrent' e -> e
f (ZAVL Path e
p AVL e
l Int#
hl e
e AVL e
r Int#
hr) = let e_ :: e
e_ = e -> e
f e
e in e
e_ e -> ZAVL e -> ZAVL e
forall a b. a -> b -> b
`seq` Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
forall e. Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
ZAVL Path e
p AVL e
l Int#
hl e
e_ AVL e
r Int#
hr
assertMoveL :: ZAVL e -> ZAVL e
assertMoveL :: forall e. ZAVL e -> ZAVL e
assertMoveL (ZAVL Path e
p AVL e
E Int#
_ e
e AVL e
r Int#
hr) = case e -> AVL e -> Int# -> (# AVL e, Int# #)
forall e. e -> AVL e -> Int# -> (# AVL e, Int# #)
pushHL e
e AVL e
r Int#
hr of UBT2(t,ht) -> Path e -> AVL e -> Int# -> ZAVL e
forall {e}. Path e -> AVL e -> Int# -> ZAVL e
cR Path e
p AVL e
t Int#
ht
where cR :: Path e -> AVL e -> Int# -> ZAVL e
cR Path e
EP AVL e
_ Int#
_ = [Char] -> ZAVL e
forall a. HasCallStack => [Char] -> a
error [Char]
"assertMoveL: Can't move left."
cR (LP Path e
p_ e
e_ AVL e
r_ Int#
hr_) AVL e
l_ Int#
hl_ = case AVL e -> Int# -> e -> AVL e -> Int# -> (# AVL e, Int# #)
forall e. AVL e -> Int# -> e -> AVL e -> Int# -> (# AVL e, Int# #)
spliceH AVL e
l_ Int#
hl_ e
e_ AVL e
r_ Int#
hr_ of UBT2(t,ht) -> Path e -> AVL e -> Int# -> ZAVL e
cR Path e
p_ AVL e
t Int#
ht
cR (RP Path e
p_ e
e_ AVL e
l_ Int#
hl_) AVL e
r_ Int#
hr_ = Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
forall e. Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
ZAVL Path e
p_ AVL e
l_ Int#
hl_ e
e_ AVL e
r_ Int#
hr_
assertMoveL (ZAVL Path e
p (N AVL e
ll e
le AVL e
lr) Int#
hl e
e AVL e
r Int#
hr) = let p_ :: Path e
p_ = Path e -> e -> AVL e -> Int# -> Path e
forall e. Path e -> e -> AVL e -> Int# -> Path e
RP (Path e -> e -> AVL e -> Int# -> Path e
forall e. Path e -> e -> AVL e -> Int# -> Path e
LP Path e
p e
e AVL e
r Int#
hr) e
le AVL e
ll DECINT2(hl)
in Path e
p_ Path e -> ZAVL e -> ZAVL e
forall a b. a -> b -> b
`seq` Path e -> Int# -> AVL e -> ZAVL e
forall e. Path e -> Int# -> AVL e -> ZAVL e
openR_ Path e
p_ DECINT1(hl) lr
assertMoveL (ZAVL Path e
p (Z AVL e
ll e
le AVL e
lr) Int#
hl e
e AVL e
r Int#
hr) = Path e -> Int# -> AVL e -> e -> AVL e -> ZAVL e
forall e. Path e -> Int# -> AVL e -> e -> AVL e -> ZAVL e
openRZ (Path e -> e -> AVL e -> Int# -> Path e
forall e. Path e -> e -> AVL e -> Int# -> Path e
LP Path e
p e
e AVL e
r Int#
hr) Int#
hl AVL e
ll e
le AVL e
lr
assertMoveL (ZAVL Path e
p (P AVL e
ll e
le AVL e
lr) Int#
hl e
e AVL e
r Int#
hr) = Path e -> Int# -> AVL e -> e -> AVL e -> ZAVL e
forall e. Path e -> Int# -> AVL e -> e -> AVL e -> ZAVL e
openRP (Path e -> e -> AVL e -> Int# -> Path e
forall e. Path e -> e -> AVL e -> Int# -> Path e
LP Path e
p e
e AVL e
r Int#
hr) Int#
hl AVL e
ll e
le AVL e
lr
tryMoveL :: ZAVL e -> Maybe (ZAVL e)
tryMoveL :: forall e. ZAVL e -> Maybe (ZAVL e)
tryMoveL (ZAVL Path e
p AVL e
E Int#
_ e
e AVL e
r Int#
hr) = case e -> AVL e -> Int# -> (# AVL e, Int# #)
forall e. e -> AVL e -> Int# -> (# AVL e, Int# #)
pushHL e
e AVL e
r Int#
hr of UBT2(t,ht) -> Path e -> AVL e -> Int# -> Maybe (ZAVL e)
forall {e}. Path e -> AVL e -> Int# -> Maybe (ZAVL e)
cR Path e
p AVL e
t Int#
ht
where cR :: Path e -> AVL e -> Int# -> Maybe (ZAVL e)
cR Path e
EP AVL e
_ Int#
_ = Maybe (ZAVL e)
forall a. Maybe a
Nothing
cR (LP Path e
p_ e
e_ AVL e
r_ Int#
hr_) AVL e
l_ Int#
hl_ = case AVL e -> Int# -> e -> AVL e -> Int# -> (# AVL e, Int# #)
forall e. AVL e -> Int# -> e -> AVL e -> Int# -> (# AVL e, Int# #)
spliceH AVL e
l_ Int#
hl_ e
e_ AVL e
r_ Int#
hr_ of UBT2(t,ht) -> Path e -> AVL e -> Int# -> Maybe (ZAVL e)
cR Path e
p_ AVL e
t Int#
ht
cR (RP Path e
p_ e
e_ AVL e
l_ Int#
hl_) AVL e
r_ Int#
hr_ = ZAVL e -> Maybe (ZAVL e)
forall a. a -> Maybe a
Just (ZAVL e -> Maybe (ZAVL e)) -> ZAVL e -> Maybe (ZAVL e)
forall a b. (a -> b) -> a -> b
$! Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
forall e. Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
ZAVL Path e
p_ AVL e
l_ Int#
hl_ e
e_ AVL e
r_ Int#
hr_
tryMoveL (ZAVL Path e
p (N AVL e
ll e
le AVL e
lr) Int#
hl e
e AVL e
r Int#
hr) = ZAVL e -> Maybe (ZAVL e)
forall a. a -> Maybe a
Just (ZAVL e -> Maybe (ZAVL e)) -> ZAVL e -> Maybe (ZAVL e)
forall a b. (a -> b) -> a -> b
$! let p_ :: Path e
p_ = Path e -> e -> AVL e -> Int# -> Path e
forall e. Path e -> e -> AVL e -> Int# -> Path e
RP (Path e -> e -> AVL e -> Int# -> Path e
forall e. Path e -> e -> AVL e -> Int# -> Path e
LP Path e
p e
e AVL e
r Int#
hr) e
le AVL e
ll DECINT2(hl)
in Path e
p_ Path e -> ZAVL e -> ZAVL e
forall a b. a -> b -> b
`seq` Path e -> Int# -> AVL e -> ZAVL e
forall e. Path e -> Int# -> AVL e -> ZAVL e
openR_ Path e
p_ DECINT1(hl) lr
tryMoveL (ZAVL Path e
p (Z AVL e
ll e
le AVL e
lr) Int#
hl e
e AVL e
r Int#
hr) = ZAVL e -> Maybe (ZAVL e)
forall a. a -> Maybe a
Just (ZAVL e -> Maybe (ZAVL e)) -> ZAVL e -> Maybe (ZAVL e)
forall a b. (a -> b) -> a -> b
$! Path e -> Int# -> AVL e -> e -> AVL e -> ZAVL e
forall e. Path e -> Int# -> AVL e -> e -> AVL e -> ZAVL e
openRZ (Path e -> e -> AVL e -> Int# -> Path e
forall e. Path e -> e -> AVL e -> Int# -> Path e
LP Path e
p e
e AVL e
r Int#
hr) Int#
hl AVL e
ll e
le AVL e
lr
tryMoveL (ZAVL Path e
p (P AVL e
ll e
le AVL e
lr) Int#
hl e
e AVL e
r Int#
hr) = ZAVL e -> Maybe (ZAVL e)
forall a. a -> Maybe a
Just (ZAVL e -> Maybe (ZAVL e)) -> ZAVL e -> Maybe (ZAVL e)
forall a b. (a -> b) -> a -> b
$! Path e -> Int# -> AVL e -> e -> AVL e -> ZAVL e
forall e. Path e -> Int# -> AVL e -> e -> AVL e -> ZAVL e
openRP (Path e -> e -> AVL e -> Int# -> Path e
forall e. Path e -> e -> AVL e -> Int# -> Path e
LP Path e
p e
e AVL e
r Int#
hr) Int#
hl AVL e
ll e
le AVL e
lr
assertMoveR :: ZAVL e -> ZAVL e
assertMoveR :: forall e. ZAVL e -> ZAVL e
assertMoveR (ZAVL Path e
p AVL e
l Int#
hl e
e AVL e
E Int#
_ ) = case AVL e -> Int# -> e -> (# AVL e, Int# #)
forall e. AVL e -> Int# -> e -> (# AVL e, Int# #)
pushHR AVL e
l Int#
hl e
e of UBT2(t,ht) -> Path e -> AVL e -> Int# -> ZAVL e
forall {e}. Path e -> AVL e -> Int# -> ZAVL e
cL Path e
p AVL e
t Int#
ht
where cL :: Path e -> AVL e -> Int# -> ZAVL e
cL Path e
EP AVL e
_ Int#
_ = [Char] -> ZAVL e
forall a. HasCallStack => [Char] -> a
error [Char]
"assertMoveR: Can't move right."
cL (RP Path e
p_ e
e_ AVL e
l_ Int#
hl_) AVL e
r_ Int#
hr_ = case AVL e -> Int# -> e -> AVL e -> Int# -> (# AVL e, Int# #)
forall e. AVL e -> Int# -> e -> AVL e -> Int# -> (# AVL e, Int# #)
spliceH AVL e
l_ Int#
hl_ e
e_ AVL e
r_ Int#
hr_ of UBT2(t,ht) -> Path e -> AVL e -> Int# -> ZAVL e
cL Path e
p_ AVL e
t Int#
ht
cL (LP Path e
p_ e
e_ AVL e
r_ Int#
hr_) AVL e
l_ Int#
hl_ = Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
forall e. Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
ZAVL Path e
p_ AVL e
l_ Int#
hl_ e
e_ AVL e
r_ Int#
hr_
assertMoveR (ZAVL Path e
p AVL e
l Int#
hl e
e (N AVL e
rl e
re AVL e
rr) Int#
hr) = Path e -> Int# -> AVL e -> e -> AVL e -> ZAVL e
forall e. Path e -> Int# -> AVL e -> e -> AVL e -> ZAVL e
openLN (Path e -> e -> AVL e -> Int# -> Path e
forall e. Path e -> e -> AVL e -> Int# -> Path e
RP Path e
p e
e AVL e
l Int#
hl) Int#
hr AVL e
rl e
re AVL e
rr
assertMoveR (ZAVL Path e
p AVL e
l Int#
hl e
e (Z AVL e
rl e
re AVL e
rr) Int#
hr) = Path e -> Int# -> AVL e -> e -> AVL e -> ZAVL e
forall e. Path e -> Int# -> AVL e -> e -> AVL e -> ZAVL e
openLZ (Path e -> e -> AVL e -> Int# -> Path e
forall e. Path e -> e -> AVL e -> Int# -> Path e
RP Path e
p e
e AVL e
l Int#
hl) Int#
hr AVL e
rl e
re AVL e
rr
assertMoveR (ZAVL Path e
p AVL e
l Int#
hl e
e (P AVL e
rl e
re AVL e
rr) Int#
hr) = let p_ :: Path e
p_ = Path e -> e -> AVL e -> Int# -> Path e
forall e. Path e -> e -> AVL e -> Int# -> Path e
LP (Path e -> e -> AVL e -> Int# -> Path e
forall e. Path e -> e -> AVL e -> Int# -> Path e
RP Path e
p e
e AVL e
l Int#
hl) e
re AVL e
rr DECINT2(hr)
in Path e
p_ Path e -> ZAVL e -> ZAVL e
forall a b. a -> b -> b
`seq` Path e -> Int# -> AVL e -> ZAVL e
forall e. Path e -> Int# -> AVL e -> ZAVL e
openL_ Path e
p_ DECINT1(hr) rl
tryMoveR :: ZAVL e -> Maybe (ZAVL e)
tryMoveR :: forall e. ZAVL e -> Maybe (ZAVL e)
tryMoveR (ZAVL Path e
p AVL e
l Int#
hl e
e AVL e
E Int#
_ ) = case AVL e -> Int# -> e -> (# AVL e, Int# #)
forall e. AVL e -> Int# -> e -> (# AVL e, Int# #)
pushHR AVL e
l Int#
hl e
e of UBT2(t,ht) -> Path e -> AVL e -> Int# -> Maybe (ZAVL e)
forall {e}. Path e -> AVL e -> Int# -> Maybe (ZAVL e)
cL Path e
p AVL e
t Int#
ht
where cL :: Path e -> AVL e -> Int# -> Maybe (ZAVL e)
cL Path e
EP AVL e
_ Int#
_ = Maybe (ZAVL e)
forall a. Maybe a
Nothing
cL (RP Path e
p_ e
e_ AVL e
l_ Int#
hl_) AVL e
r_ Int#
hr_ = case AVL e -> Int# -> e -> AVL e -> Int# -> (# AVL e, Int# #)
forall e. AVL e -> Int# -> e -> AVL e -> Int# -> (# AVL e, Int# #)
spliceH AVL e
l_ Int#
hl_ e
e_ AVL e
r_ Int#
hr_ of UBT2(t,ht) -> Path e -> AVL e -> Int# -> Maybe (ZAVL e)
cL Path e
p_ AVL e
t Int#
ht
cL (LP Path e
p_ e
e_ AVL e
r_ Int#
hr_) AVL e
l_ Int#
hl_ = ZAVL e -> Maybe (ZAVL e)
forall a. a -> Maybe a
Just (ZAVL e -> Maybe (ZAVL e)) -> ZAVL e -> Maybe (ZAVL e)
forall a b. (a -> b) -> a -> b
$! Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
forall e. Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
ZAVL Path e
p_ AVL e
l_ Int#
hl_ e
e_ AVL e
r_ Int#
hr_
tryMoveR (ZAVL Path e
p AVL e
l Int#
hl e
e (N AVL e
rl e
re AVL e
rr) Int#
hr) = ZAVL e -> Maybe (ZAVL e)
forall a. a -> Maybe a
Just (ZAVL e -> Maybe (ZAVL e)) -> ZAVL e -> Maybe (ZAVL e)
forall a b. (a -> b) -> a -> b
$! Path e -> Int# -> AVL e -> e -> AVL e -> ZAVL e
forall e. Path e -> Int# -> AVL e -> e -> AVL e -> ZAVL e
openLN (Path e -> e -> AVL e -> Int# -> Path e
forall e. Path e -> e -> AVL e -> Int# -> Path e
RP Path e
p e
e AVL e
l Int#
hl) Int#
hr AVL e
rl e
re AVL e
rr
tryMoveR (ZAVL Path e
p AVL e
l Int#
hl e
e (Z AVL e
rl e
re AVL e
rr) Int#
hr) = ZAVL e -> Maybe (ZAVL e)
forall a. a -> Maybe a
Just (ZAVL e -> Maybe (ZAVL e)) -> ZAVL e -> Maybe (ZAVL e)
forall a b. (a -> b) -> a -> b
$! Path e -> Int# -> AVL e -> e -> AVL e -> ZAVL e
forall e. Path e -> Int# -> AVL e -> e -> AVL e -> ZAVL e
openLZ (Path e -> e -> AVL e -> Int# -> Path e
forall e. Path e -> e -> AVL e -> Int# -> Path e
RP Path e
p e
e AVL e
l Int#
hl) Int#
hr AVL e
rl e
re AVL e
rr
tryMoveR (ZAVL Path e
p AVL e
l Int#
hl e
e (P AVL e
rl e
re AVL e
rr) Int#
hr) = ZAVL e -> Maybe (ZAVL e)
forall a. a -> Maybe a
Just (ZAVL e -> Maybe (ZAVL e)) -> ZAVL e -> Maybe (ZAVL e)
forall a b. (a -> b) -> a -> b
$! let p_ :: Path e
p_ = Path e -> e -> AVL e -> Int# -> Path e
forall e. Path e -> e -> AVL e -> Int# -> Path e
LP (Path e -> e -> AVL e -> Int# -> Path e
forall e. Path e -> e -> AVL e -> Int# -> Path e
RP Path e
p e
e AVL e
l Int#
hl) e
re AVL e
rr DECINT2(hr)
in Path e
p_ Path e -> ZAVL e -> ZAVL e
forall a b. a -> b -> b
`seq` Path e -> Int# -> AVL e -> ZAVL e
forall e. Path e -> Int# -> AVL e -> ZAVL e
openL_ Path e
p_ DECINT1(hr) rl
isLeftmost :: ZAVL e -> Bool
isLeftmost :: forall e. ZAVL e -> Bool
isLeftmost (ZAVL Path e
p AVL e
E Int#
_ e
_ AVL e
_ Int#
_) = Path e -> Bool
forall {e}. Path e -> Bool
iL Path e
p
where iL :: Path e -> Bool
iL Path e
EP = Bool
True
iL (LP Path e
p_ e
_ AVL e
_ Int#
_) = Path e -> Bool
iL Path e
p_
iL (RP Path e
_ e
_ AVL e
_ Int#
_) = Bool
False
isLeftmost (ZAVL Path e
_ AVL e
_ Int#
_ e
_ AVL e
_ Int#
_) = Bool
False
isRightmost :: ZAVL e -> Bool
isRightmost :: forall e. ZAVL e -> Bool
isRightmost (ZAVL Path e
p AVL e
_ Int#
_ e
_ AVL e
E Int#
_) = Path e -> Bool
forall {e}. Path e -> Bool
iR Path e
p
where iR :: Path e -> Bool
iR Path e
EP = Bool
True
iR (RP Path e
p_ e
_ AVL e
_ Int#
_) = Path e -> Bool
iR Path e
p_
iR (LP Path e
_ e
_ AVL e
_ Int#
_) = Bool
False
isRightmost (ZAVL Path e
_ AVL e
_ Int#
_ e
_ AVL e
_ Int#
_) = Bool
False
insertL :: e -> ZAVL e -> ZAVL e
insertL :: forall e. e -> ZAVL e -> ZAVL e
insertL e
e0 (ZAVL Path e
p AVL e
l Int#
hl e
e1 AVL e
r Int#
hr) = case AVL e -> Int# -> e -> (# AVL e, Int# #)
forall e. AVL e -> Int# -> e -> (# AVL e, Int# #)
pushHR AVL e
l Int#
hl e
e0 of UBT2(l_,hl_) -> Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
forall e. Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
ZAVL Path e
p AVL e
l_ Int#
hl_ e
e1 AVL e
r Int#
hr
insertMoveL :: e -> ZAVL e -> ZAVL e
insertMoveL :: forall e. e -> ZAVL e -> ZAVL e
insertMoveL e
e0 (ZAVL Path e
p AVL e
l Int#
hl e
e1 AVL e
r Int#
hr) = case e -> AVL e -> Int# -> (# AVL e, Int# #)
forall e. e -> AVL e -> Int# -> (# AVL e, Int# #)
pushHL e
e1 AVL e
r Int#
hr of UBT2(r_,hr_) -> Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
forall e. Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
ZAVL Path e
p AVL e
l Int#
hl e
e0 AVL e
r_ Int#
hr_
insertR :: ZAVL e -> e -> ZAVL e
insertR :: forall e. ZAVL e -> e -> ZAVL e
insertR (ZAVL Path e
p AVL e
l Int#
hl e
e0 AVL e
r Int#
hr) e
e1 = case e -> AVL e -> Int# -> (# AVL e, Int# #)
forall e. e -> AVL e -> Int# -> (# AVL e, Int# #)
pushHL e
e1 AVL e
r Int#
hr of UBT2(r_,hr_) -> Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
forall e. Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
ZAVL Path e
p AVL e
l Int#
hl e
e0 AVL e
r_ Int#
hr_
insertMoveR :: ZAVL e -> e -> ZAVL e
insertMoveR :: forall e. ZAVL e -> e -> ZAVL e
insertMoveR (ZAVL Path e
p AVL e
l Int#
hl e
e0 AVL e
r Int#
hr) e
e1 = case AVL e -> Int# -> e -> (# AVL e, Int# #)
forall e. AVL e -> Int# -> e -> (# AVL e, Int# #)
pushHR AVL e
l Int#
hl e
e0 of UBT2(l_,hl_) -> Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
forall e. Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
ZAVL Path e
p AVL e
l_ Int#
hl_ e
e1 AVL e
r Int#
hr
insertTreeL :: AVL e -> ZAVL e -> ZAVL e
insertTreeL :: forall e. AVL e -> ZAVL e -> ZAVL e
insertTreeL AVL e
E ZAVL e
zavl = ZAVL e
zavl
insertTreeL t :: AVL e
t@(N AVL e
l e
_ AVL e
_) ZAVL e
zavl = AVL e -> Int# -> ZAVL e -> ZAVL e
forall e. AVL e -> Int# -> ZAVL e -> ZAVL e
insertLH AVL e
t (Int# -> AVL e -> Int#
forall e. Int# -> AVL e -> Int#
addHeight L(2AVL e
) l) zavl
insertTreeL t :: AVL e
t@(Z AVL e
l e
_ AVL e
_) ZAVL e
zavl = AVL e -> Int# -> ZAVL e -> ZAVL e
forall e. AVL e -> Int# -> ZAVL e -> ZAVL e
insertLH AVL e
t (Int# -> AVL e -> Int#
forall e. Int# -> AVL e -> Int#
addHeight L(1AVL e
) l) zavl
insertTreeL t :: AVL e
t@(P AVL e
_ e
_ AVL e
r) ZAVL e
zavl = AVL e -> Int# -> ZAVL e -> ZAVL e
forall e. AVL e -> Int# -> ZAVL e -> ZAVL e
insertLH AVL e
t (Int# -> AVL e -> Int#
forall e. Int# -> AVL e -> Int#
addHeight L(2AVL e
) r) zavl
insertLH :: AVL e -> UINT -> ZAVL e -> ZAVL e
insertLH :: forall e. AVL e -> Int# -> ZAVL e -> ZAVL e
insertLH AVL e
t Int#
ht (ZAVL Path e
p AVL e
l Int#
hl e
e AVL e
r Int#
hr) =
let offset :: Int#
offset = case Int# -> Int# -> Ordering
COMPAREUINT Int#
hl Int#
hr of
Ordering
LT -> SUBINT(hl,height l)
Ordering
EQ -> SUBINT(hl,height l)
Ordering
GT -> SUBINT(hr,height r)
in case AVL e -> Int# -> AVL e -> Int# -> (# AVL e, Int# #)
forall e. AVL e -> Int# -> AVL e -> Int# -> (# AVL e, Int# #)
joinH AVL e
l Int#
hl AVL e
t ADDINT(ht,offset) of UBT2(l_,hl_) -> ZAVL p l_ hl_ e r hr
insertTreeR :: ZAVL e -> AVL e -> ZAVL e
insertTreeR :: forall e. ZAVL e -> AVL e -> ZAVL e
insertTreeR ZAVL e
zavl AVL e
E = ZAVL e
zavl
insertTreeR ZAVL e
zavl t :: AVL e
t@(N AVL e
l e
_ AVL e
_) = AVL e -> Int# -> ZAVL e -> ZAVL e
forall e. AVL e -> Int# -> ZAVL e -> ZAVL e
insertRH AVL e
t (Int# -> AVL e -> Int#
forall e. Int# -> AVL e -> Int#
addHeight L(2AVL e
) l) zavl
insertTreeR ZAVL e
zavl t :: AVL e
t@(Z AVL e
l e
_ AVL e
_) = AVL e -> Int# -> ZAVL e -> ZAVL e
forall e. AVL e -> Int# -> ZAVL e -> ZAVL e
insertRH AVL e
t (Int# -> AVL e -> Int#
forall e. Int# -> AVL e -> Int#
addHeight L(1AVL e
) l) zavl
insertTreeR ZAVL e
zavl t :: AVL e
t@(P AVL e
_ e
_ AVL e
r) = AVL e -> Int# -> ZAVL e -> ZAVL e
forall e. AVL e -> Int# -> ZAVL e -> ZAVL e
insertRH AVL e
t (Int# -> AVL e -> Int#
forall e. Int# -> AVL e -> Int#
addHeight L(2AVL e
) r) zavl
insertRH :: AVL e -> UINT -> ZAVL e -> ZAVL e
insertRH :: forall e. AVL e -> Int# -> ZAVL e -> ZAVL e
insertRH AVL e
t Int#
ht (ZAVL Path e
p AVL e
l Int#
hl e
e AVL e
r Int#
hr) =
let offset :: Int#
offset = case Int# -> Int# -> Ordering
COMPAREUINT Int#
hl Int#
hr of
Ordering
LT -> SUBINT(hl,height l)
Ordering
EQ -> SUBINT(hr,height r)
Ordering
GT -> SUBINT(hr,height r)
in case AVL e -> Int# -> AVL e -> Int# -> (# AVL e, Int# #)
forall e. AVL e -> Int# -> AVL e -> Int# -> (# AVL e, Int# #)
joinH AVL e
t ADDINT(ht,offset) r hr of UBT2(r_,hr_) -> ZAVL p l hl e r_ hr_
assertDelMoveL :: ZAVL e -> ZAVL e
assertDelMoveL :: forall e. ZAVL e -> ZAVL e
assertDelMoveL (ZAVL Path e
p AVL e
E Int#
_ e
_ AVL e
r Int#
hr) = Path e -> AVL e -> Int# -> ZAVL e
forall {e}. Path e -> AVL e -> Int# -> ZAVL e
dR Path e
p AVL e
r Int#
hr
where dR :: Path e -> AVL e -> Int# -> ZAVL e
dR Path e
EP AVL e
_ Int#
_ = [Char] -> ZAVL e
forall a. HasCallStack => [Char] -> a
error [Char]
"assertDelMoveL: Can't move left."
dR (LP Path e
p_ e
e_ AVL e
r_ Int#
hr_) AVL e
l_ Int#
hl_ = case AVL e -> Int# -> e -> AVL e -> Int# -> (# AVL e, Int# #)
forall e. AVL e -> Int# -> e -> AVL e -> Int# -> (# AVL e, Int# #)
spliceH AVL e
l_ Int#
hl_ e
e_ AVL e
r_ Int#
hr_ of UBT2(t,ht) -> Path e -> AVL e -> Int# -> ZAVL e
dR Path e
p_ AVL e
t Int#
ht
dR (RP Path e
p_ e
e_ AVL e
l_ Int#
hl_) AVL e
r_ Int#
hr_ = Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
forall e. Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
ZAVL Path e
p_ AVL e
l_ Int#
hl_ e
e_ AVL e
r_ Int#
hr_
assertDelMoveL (ZAVL Path e
p (N AVL e
ll e
le AVL e
lr) Int#
hl e
_ AVL e
r Int#
hr) = case AVL e -> e -> AVL e -> (# AVL e, e #)
forall e. AVL e -> e -> AVL e -> (# AVL e, e #)
popRN AVL e
ll e
le AVL e
lr of
UBT2(e
l,e) -> case AVL e
l of
Z AVL e
_ e
_ AVL e
_ -> Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
forall e. Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
ZAVL Path e
p AVL e
l DECINT1(hl) e r hr
N AVL e
_ e
_ AVL e
_ -> Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
forall e. Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
ZAVL Path e
p AVL e
l Int#
hl e
e AVL e
r Int#
hr
AVL e
_ -> [Char] -> ZAVL e
forall a. HasCallStack => [Char] -> a
error [Char]
"assertDelMoveL: Bug0"
assertDelMoveL (ZAVL Path e
p (Z AVL e
ll e
le AVL e
lr) Int#
hl e
_ AVL e
r Int#
hr) = case AVL e -> e -> AVL e -> (# AVL e, e #)
forall e. AVL e -> e -> AVL e -> (# AVL e, e #)
popRZ AVL e
ll e
le AVL e
lr of
UBT2(e
l,e) -> case AVL e
l of
AVL e
E -> Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
forall e. Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
ZAVL Path e
p AVL e
l DECINT1(hl) e r hr
N AVL e
_ e
_ AVL e
_ -> [Char] -> ZAVL e
forall a. HasCallStack => [Char] -> a
error [Char]
"assertDelMoveL: Bug1"
AVL e
_ -> Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
forall e. Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
ZAVL Path e
p AVL e
l Int#
hl e
e AVL e
r Int#
hr
assertDelMoveL (ZAVL Path e
p (P AVL e
ll e
le AVL e
lr) Int#
hl e
_ AVL e
r Int#
hr) = case AVL e -> e -> AVL e -> (# AVL e, e #)
forall e. AVL e -> e -> AVL e -> (# AVL e, e #)
popRP AVL e
ll e
le AVL e
lr of
UBT2(e
l,e) -> case AVL e
l of
AVL e
E -> [Char] -> ZAVL e
forall a. HasCallStack => [Char] -> a
error [Char]
"assertDelMoveL: Bug2"
Z AVL e
_ e
_ AVL e
_ -> Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
forall e. Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
ZAVL Path e
p AVL e
l DECINT1(hl) e r hr
AVL e
_ -> Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
forall e. Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
ZAVL Path e
p AVL e
l Int#
hl e
e AVL e
r Int#
hr
tryDelMoveL :: ZAVL e -> Maybe (ZAVL e)
tryDelMoveL :: forall e. ZAVL e -> Maybe (ZAVL e)
tryDelMoveL (ZAVL Path e
p AVL e
E Int#
_ e
_ AVL e
r Int#
hr) = Path e -> AVL e -> Int# -> Maybe (ZAVL e)
forall {e}. Path e -> AVL e -> Int# -> Maybe (ZAVL e)
dR Path e
p AVL e
r Int#
hr
where dR :: Path e -> AVL e -> Int# -> Maybe (ZAVL e)
dR Path e
EP AVL e
_ Int#
_ = Maybe (ZAVL e)
forall a. Maybe a
Nothing
dR (LP Path e
p_ e
e_ AVL e
r_ Int#
hr_) AVL e
l_ Int#
hl_ = case AVL e -> Int# -> e -> AVL e -> Int# -> (# AVL e, Int# #)
forall e. AVL e -> Int# -> e -> AVL e -> Int# -> (# AVL e, Int# #)
spliceH AVL e
l_ Int#
hl_ e
e_ AVL e
r_ Int#
hr_ of UBT2(t,ht) -> Path e -> AVL e -> Int# -> Maybe (ZAVL e)
dR Path e
p_ AVL e
t Int#
ht
dR (RP Path e
p_ e
e_ AVL e
l_ Int#
hl_) AVL e
r_ Int#
hr_ = ZAVL e -> Maybe (ZAVL e)
forall a. a -> Maybe a
Just (ZAVL e -> Maybe (ZAVL e)) -> ZAVL e -> Maybe (ZAVL e)
forall a b. (a -> b) -> a -> b
$! Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
forall e. Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
ZAVL Path e
p_ AVL e
l_ Int#
hl_ e
e_ AVL e
r_ Int#
hr_
tryDelMoveL (ZAVL Path e
p (N AVL e
ll e
le AVL e
lr) Int#
hl e
_ AVL e
r Int#
hr) = ZAVL e -> Maybe (ZAVL e)
forall a. a -> Maybe a
Just (ZAVL e -> Maybe (ZAVL e)) -> ZAVL e -> Maybe (ZAVL e)
forall a b. (a -> b) -> a -> b
$! case AVL e -> e -> AVL e -> (# AVL e, e #)
forall e. AVL e -> e -> AVL e -> (# AVL e, e #)
popRN AVL e
ll e
le AVL e
lr of
UBT2(e
l,e) -> case AVL e
l of
Z AVL e
_ e
_ AVL e
_ -> Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
forall e. Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
ZAVL Path e
p AVL e
l DECINT1(hl) e r hr
N AVL e
_ e
_ AVL e
_ -> Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
forall e. Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
ZAVL Path e
p AVL e
l Int#
hl e
e AVL e
r Int#
hr
AVL e
_ -> [Char] -> ZAVL e
forall a. HasCallStack => [Char] -> a
error [Char]
"tryDelMoveL: Bug0"
tryDelMoveL (ZAVL Path e
p (Z AVL e
ll e
le AVL e
lr) Int#
hl e
_ AVL e
r Int#
hr) = ZAVL e -> Maybe (ZAVL e)
forall a. a -> Maybe a
Just (ZAVL e -> Maybe (ZAVL e)) -> ZAVL e -> Maybe (ZAVL e)
forall a b. (a -> b) -> a -> b
$! case AVL e -> e -> AVL e -> (# AVL e, e #)
forall e. AVL e -> e -> AVL e -> (# AVL e, e #)
popRZ AVL e
ll e
le AVL e
lr of
UBT2(e
l,e) -> case AVL e
l of
AVL e
E -> Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
forall e. Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
ZAVL Path e
p AVL e
l DECINT1(hl) e r hr
N AVL e
_ e
_ AVL e
_ -> [Char] -> ZAVL e
forall a. HasCallStack => [Char] -> a
error [Char]
"tryDelMoveL: Bug1"
AVL e
_ -> Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
forall e. Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
ZAVL Path e
p AVL e
l Int#
hl e
e AVL e
r Int#
hr
tryDelMoveL (ZAVL Path e
p (P AVL e
ll e
le AVL e
lr) Int#
hl e
_ AVL e
r Int#
hr) = ZAVL e -> Maybe (ZAVL e)
forall a. a -> Maybe a
Just (ZAVL e -> Maybe (ZAVL e)) -> ZAVL e -> Maybe (ZAVL e)
forall a b. (a -> b) -> a -> b
$! case AVL e -> e -> AVL e -> (# AVL e, e #)
forall e. AVL e -> e -> AVL e -> (# AVL e, e #)
popRP AVL e
ll e
le AVL e
lr of
UBT2(e
l,e) -> case AVL e
l of
AVL e
E -> [Char] -> ZAVL e
forall a. HasCallStack => [Char] -> a
error [Char]
"tryDelMoveL: Bug2"
Z AVL e
_ e
_ AVL e
_ -> Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
forall e. Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
ZAVL Path e
p AVL e
l DECINT1(hl) e r hr
AVL e
_ -> Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
forall e. Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
ZAVL Path e
p AVL e
l Int#
hl e
e AVL e
r Int#
hr
assertDelMoveR :: ZAVL e -> ZAVL e
assertDelMoveR :: forall e. ZAVL e -> ZAVL e
assertDelMoveR (ZAVL Path e
p AVL e
l Int#
hl e
_ AVL e
E Int#
_ ) = Path e -> AVL e -> Int# -> ZAVL e
forall {e}. Path e -> AVL e -> Int# -> ZAVL e
dL Path e
p AVL e
l Int#
hl
where dL :: Path e -> AVL e -> Int# -> ZAVL e
dL Path e
EP AVL e
_ Int#
_ = [Char] -> ZAVL e
forall a. HasCallStack => [Char] -> a
error [Char]
"delMoveR: Can't move right."
dL (LP Path e
p_ e
e_ AVL e
r_ Int#
hr_) AVL e
l_ Int#
hl_ = Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
forall e. Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
ZAVL Path e
p_ AVL e
l_ Int#
hl_ e
e_ AVL e
r_ Int#
hr_
dL (RP Path e
p_ e
e_ AVL e
l_ Int#
hl_) AVL e
r_ Int#
hr_ = case AVL e -> Int# -> e -> AVL e -> Int# -> (# AVL e, Int# #)
forall e. AVL e -> Int# -> e -> AVL e -> Int# -> (# AVL e, Int# #)
spliceH AVL e
l_ Int#
hl_ e
e_ AVL e
r_ Int#
hr_ of UBT2(t,ht) -> Path e -> AVL e -> Int# -> ZAVL e
dL Path e
p_ AVL e
t Int#
ht
assertDelMoveR (ZAVL Path e
p AVL e
l Int#
hl e
_ (N AVL e
rl e
re AVL e
rr) Int#
hr) = case AVL e -> e -> AVL e -> (# e, AVL e #)
forall e. AVL e -> e -> AVL e -> (# e, AVL e #)
popLN AVL e
rl e
re AVL e
rr of
UBT2(AVL e
e,r) -> case AVL e
r of
AVL e
E -> [Char] -> ZAVL e
forall a. HasCallStack => [Char] -> a
error [Char]
"delMoveR: Bug0"
Z AVL e
_ e
_ AVL e
_ -> Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
forall e. Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
ZAVL Path e
p AVL e
l Int#
hl e
e AVL e
r DECINT1(hr)
AVL e
_ -> Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
forall e. Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
ZAVL Path e
p AVL e
l Int#
hl e
e AVL e
r Int#
hr
assertDelMoveR (ZAVL Path e
p AVL e
l Int#
hl e
_ (Z AVL e
rl e
re AVL e
rr) Int#
hr) = case AVL e -> e -> AVL e -> (# e, AVL e #)
forall e. AVL e -> e -> AVL e -> (# e, AVL e #)
popLZ AVL e
rl e
re AVL e
rr of
UBT2(AVL e
e,r) -> case AVL e
r of
AVL e
E -> Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
forall e. Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
ZAVL Path e
p AVL e
l Int#
hl e
e AVL e
r DECINT1(hr)
P AVL e
_ e
_ AVL e
_ -> [Char] -> ZAVL e
forall a. HasCallStack => [Char] -> a
error [Char]
"delMoveR: Bug1"
AVL e
_ -> Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
forall e. Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
ZAVL Path e
p AVL e
l Int#
hl e
e AVL e
r Int#
hr
assertDelMoveR (ZAVL Path e
p AVL e
l Int#
hl e
_ (P AVL e
rl e
re AVL e
rr) Int#
hr) = case AVL e -> e -> AVL e -> (# e, AVL e #)
forall e. AVL e -> e -> AVL e -> (# e, AVL e #)
popLP AVL e
rl e
re AVL e
rr of
UBT2(AVL e
e,r) -> case AVL e
r of
Z AVL e
_ e
_ AVL e
_ -> Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
forall e. Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
ZAVL Path e
p AVL e
l Int#
hl e
e AVL e
r DECINT1(hr)
P AVL e
_ e
_ AVL e
_ -> Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
forall e. Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
ZAVL Path e
p AVL e
l Int#
hl e
e AVL e
r Int#
hr
AVL e
_ -> [Char] -> ZAVL e
forall a. HasCallStack => [Char] -> a
error [Char]
"delMoveR: Bug2"
tryDelMoveR :: ZAVL e -> Maybe (ZAVL e)
tryDelMoveR :: forall e. ZAVL e -> Maybe (ZAVL e)
tryDelMoveR (ZAVL Path e
p AVL e
l Int#
hl e
_ AVL e
E Int#
_ ) = Path e -> AVL e -> Int# -> Maybe (ZAVL e)
forall {e}. Path e -> AVL e -> Int# -> Maybe (ZAVL e)
dL Path e
p AVL e
l Int#
hl
where dL :: Path e -> AVL e -> Int# -> Maybe (ZAVL e)
dL Path e
EP AVL e
_ Int#
_ = Maybe (ZAVL e)
forall a. Maybe a
Nothing
dL (LP Path e
p_ e
e_ AVL e
r_ Int#
hr_) AVL e
l_ Int#
hl_ = ZAVL e -> Maybe (ZAVL e)
forall a. a -> Maybe a
Just (ZAVL e -> Maybe (ZAVL e)) -> ZAVL e -> Maybe (ZAVL e)
forall a b. (a -> b) -> a -> b
$! Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
forall e. Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
ZAVL Path e
p_ AVL e
l_ Int#
hl_ e
e_ AVL e
r_ Int#
hr_
dL (RP Path e
p_ e
e_ AVL e
l_ Int#
hl_) AVL e
r_ Int#
hr_ = case AVL e -> Int# -> e -> AVL e -> Int# -> (# AVL e, Int# #)
forall e. AVL e -> Int# -> e -> AVL e -> Int# -> (# AVL e, Int# #)
spliceH AVL e
l_ Int#
hl_ e
e_ AVL e
r_ Int#
hr_ of UBT2(t,ht) -> Path e -> AVL e -> Int# -> Maybe (ZAVL e)
dL Path e
p_ AVL e
t Int#
ht
tryDelMoveR (ZAVL Path e
p AVL e
l Int#
hl e
_ (N AVL e
rl e
re AVL e
rr) Int#
hr) = ZAVL e -> Maybe (ZAVL e)
forall a. a -> Maybe a
Just (ZAVL e -> Maybe (ZAVL e)) -> ZAVL e -> Maybe (ZAVL e)
forall a b. (a -> b) -> a -> b
$! case AVL e -> e -> AVL e -> (# e, AVL e #)
forall e. AVL e -> e -> AVL e -> (# e, AVL e #)
popLN AVL e
rl e
re AVL e
rr of
UBT2(AVL e
e,r) -> case AVL e
r of
AVL e
E -> [Char] -> ZAVL e
forall a. HasCallStack => [Char] -> a
error [Char]
"tryDelMoveR: Bug0"
Z AVL e
_ e
_ AVL e
_ -> Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
forall e. Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
ZAVL Path e
p AVL e
l Int#
hl e
e AVL e
r DECINT1(hr)
AVL e
_ -> Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
forall e. Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
ZAVL Path e
p AVL e
l Int#
hl e
e AVL e
r Int#
hr
tryDelMoveR (ZAVL Path e
p AVL e
l Int#
hl e
_ (Z AVL e
rl e
re AVL e
rr) Int#
hr) = ZAVL e -> Maybe (ZAVL e)
forall a. a -> Maybe a
Just (ZAVL e -> Maybe (ZAVL e)) -> ZAVL e -> Maybe (ZAVL e)
forall a b. (a -> b) -> a -> b
$! case AVL e -> e -> AVL e -> (# e, AVL e #)
forall e. AVL e -> e -> AVL e -> (# e, AVL e #)
popLZ AVL e
rl e
re AVL e
rr of
UBT2(AVL e
e,r) -> case AVL e
r of
AVL e
E -> Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
forall e. Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
ZAVL Path e
p AVL e
l Int#
hl e
e AVL e
r DECINT1(hr)
P AVL e
_ e
_ AVL e
_ -> [Char] -> ZAVL e
forall a. HasCallStack => [Char] -> a
error [Char]
"tryDelMoveR: Bug1"
AVL e
_ -> Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
forall e. Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
ZAVL Path e
p AVL e
l Int#
hl e
e AVL e
r Int#
hr
tryDelMoveR (ZAVL Path e
p AVL e
l Int#
hl e
_ (P AVL e
rl e
re AVL e
rr) Int#
hr) = ZAVL e -> Maybe (ZAVL e)
forall a. a -> Maybe a
Just (ZAVL e -> Maybe (ZAVL e)) -> ZAVL e -> Maybe (ZAVL e)
forall a b. (a -> b) -> a -> b
$! case AVL e -> e -> AVL e -> (# e, AVL e #)
forall e. AVL e -> e -> AVL e -> (# e, AVL e #)
popLP AVL e
rl e
re AVL e
rr of
UBT2(AVL e
e,r) -> case AVL e
r of
Z AVL e
_ e
_ AVL e
_ -> Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
forall e. Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
ZAVL Path e
p AVL e
l Int#
hl e
e AVL e
r DECINT1(hr)
P AVL e
_ e
_ AVL e
_ -> Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
forall e. Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
ZAVL Path e
p AVL e
l Int#
hl e
e AVL e
r Int#
hr
AVL e
_ -> [Char] -> ZAVL e
forall a. HasCallStack => [Char] -> a
error [Char]
"tryDelMoveR: Bug2"
delAllL :: ZAVL e -> ZAVL e
delAllL :: forall e. ZAVL e -> ZAVL e
delAllL (ZAVL Path e
p AVL e
l Int#
hl e
e AVL e
r Int#
hr) =
let hE :: Int#
hE = case Int# -> Int# -> Ordering
COMPAREUINT Int#
hl Int#
hr of
Ordering
LT -> SUBINT(hl,height l)
Ordering
EQ -> SUBINT(hr,height r)
Ordering
GT -> SUBINT(hr,height r)
p_ :: Path e
p_ = Path e -> Path e
forall e. Path e -> Path e
noRP Path e
p
in Path e
p_ Path e -> ZAVL e -> ZAVL e
forall a b. a -> b -> b
`seq` Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
forall e. Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
ZAVL Path e
p_ AVL e
forall e. AVL e
E Int#
hE e
e AVL e
r Int#
hr
delAllR :: ZAVL e -> ZAVL e
delAllR :: forall e. ZAVL e -> ZAVL e
delAllR (ZAVL Path e
p AVL e
l Int#
hl e
e AVL e
r Int#
hr) =
let hE :: Int#
hE = case Int# -> Int# -> Ordering
COMPAREUINT Int#
hl Int#
hr of
Ordering
LT -> SUBINT(hl,height l)
Ordering
EQ -> SUBINT(hl,height l)
Ordering
GT -> SUBINT(hr,height r)
p_ :: Path e
p_ = Path e -> Path e
forall e. Path e -> Path e
noLP Path e
p
in Path e
p_ Path e -> ZAVL e -> ZAVL e
forall a b. a -> b -> b
`seq` Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
forall e. Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
ZAVL Path e
p_ AVL e
l Int#
hl e
e AVL e
forall e. AVL e
E Int#
hE
delAllCloseL :: ZAVL e -> AVL e
delAllCloseL :: forall e. ZAVL e -> AVL e
delAllCloseL (ZAVL Path e
p AVL e
_ Int#
_ e
e AVL e
r Int#
hr) = case e -> AVL e -> Int# -> (# AVL e, Int# #)
forall e. e -> AVL e -> Int# -> (# AVL e, Int# #)
pushHL e
e AVL e
r Int#
hr of UBT2(t,ht) -> Path e -> AVL e -> Int# -> AVL e
forall e. Path e -> AVL e -> Int# -> AVL e
closeNoRP Path e
p AVL e
t Int#
ht
delAllCloseR :: ZAVL e -> AVL e
delAllCloseR :: forall e. ZAVL e -> AVL e
delAllCloseR (ZAVL Path e
p AVL e
l Int#
hl e
e AVL e
_ Int#
_) = case AVL e -> Int# -> e -> (# AVL e, Int# #)
forall e. AVL e -> Int# -> e -> (# AVL e, Int# #)
pushHR AVL e
l Int#
hl e
e of UBT2(t,ht) -> Path e -> AVL e -> Int# -> AVL e
forall e. Path e -> AVL e -> Int# -> AVL e
closeNoLP Path e
p AVL e
t Int#
ht
delAllIncCloseL :: ZAVL e -> AVL e
delAllIncCloseL :: forall e. ZAVL e -> AVL e
delAllIncCloseL (ZAVL Path e
p AVL e
_ Int#
_ e
_ AVL e
r Int#
hr) = Path e -> AVL e -> Int# -> AVL e
forall e. Path e -> AVL e -> Int# -> AVL e
closeNoRP Path e
p AVL e
r Int#
hr
delAllIncCloseR :: ZAVL e -> AVL e
delAllIncCloseR :: forall e. ZAVL e -> AVL e
delAllIncCloseR (ZAVL Path e
p AVL e
l Int#
hl e
_ AVL e
_ Int#
_) = Path e -> AVL e -> Int# -> AVL e
forall e. Path e -> AVL e -> Int# -> AVL e
closeNoLP Path e
p AVL e
l Int#
hl
sizeL :: ZAVL e -> Int
sizeL :: forall e. ZAVL e -> Int
sizeL (ZAVL Path e
p AVL e
l Int#
_ e
_ AVL e
_ Int#
_) = Int -> Path e -> Int
forall e. Int -> Path e -> Int
addSizeRP (AVL e -> Int
forall e. AVL e -> Int
size AVL e
l) Path e
p
sizeR :: ZAVL e -> Int
sizeR :: forall e. ZAVL e -> Int
sizeR (ZAVL Path e
p AVL e
_ Int#
_ e
_ AVL e
r Int#
_) = Int -> Path e -> Int
forall e. Int -> Path e -> Int
addSizeLP (AVL e -> Int
forall e. AVL e -> Int
size AVL e
r) Path e
p
sizeZAVL :: ZAVL e -> Int
sizeZAVL :: forall e. ZAVL e -> Int
sizeZAVL (ZAVL Path e
p AVL e
l Int#
_ e
_ AVL e
r Int#
_) = Int -> Path e -> Int
forall e. Int -> Path e -> Int
addSizeP (Int -> AVL e -> Int
forall e. Int -> AVL e -> Int
addSize (Int -> AVL e -> Int
forall e. Int -> AVL e -> Int
addSize Int
1 AVL e
l) AVL e
r) Path e
p
data BAVL e = BAVL (AVL e) (BinPath e)
openBAVL :: (e -> Ordering) -> AVL e -> BAVL e
{-# INLINE openBAVL #-}
openBAVL :: forall e. (e -> Ordering) -> AVL e -> BAVL e
openBAVL e -> Ordering
c AVL e
t = BinPath e
bp BinPath e -> BAVL e -> BAVL e
forall a b. a -> b -> b
`seq` AVL e -> BinPath e -> BAVL e
forall e. AVL e -> BinPath e -> BAVL e
BAVL AVL e
t BinPath e
bp
where bp :: BinPath e
bp = (e -> Ordering) -> AVL e -> BinPath e
forall e. (e -> Ordering) -> AVL e -> BinPath e
openPath e -> Ordering
c AVL e
t
closeBAVL :: BAVL e -> AVL e
{-# INLINE closeBAVL #-}
closeBAVL :: forall e. BAVL e -> AVL e
closeBAVL (BAVL AVL e
t BinPath e
_) = AVL e
t
fullBAVL :: BAVL e -> Bool
{-# INLINE fullBAVL #-}
fullBAVL :: forall e. BAVL e -> Bool
fullBAVL (BAVL AVL e
_ (FullBP Int#
_ e
_)) = Bool
True
fullBAVL (BAVL AVL e
_ (EmptyBP Int#
_ )) = Bool
False
emptyBAVL :: BAVL e -> Bool
{-# INLINE emptyBAVL #-}
emptyBAVL :: forall e. BAVL e -> Bool
emptyBAVL (BAVL AVL e
_ (FullBP Int#
_ e
_)) = Bool
False
emptyBAVL (BAVL AVL e
_ (EmptyBP Int#
_ )) = Bool
True
tryReadBAVL :: BAVL e -> Maybe e
{-# INLINE tryReadBAVL #-}
tryReadBAVL :: forall e. BAVL e -> Maybe e
tryReadBAVL (BAVL AVL e
_ (FullBP Int#
_ e
e)) = e -> Maybe e
forall a. a -> Maybe a
Just e
e
tryReadBAVL (BAVL AVL e
_ (EmptyBP Int#
_ )) = Maybe e
forall a. Maybe a
Nothing
readFullBAVL :: BAVL e -> e
{-# INLINE readFullBAVL #-}
readFullBAVL :: forall e. BAVL e -> e
readFullBAVL (BAVL AVL e
_ (FullBP Int#
_ e
e)) = e
e
readFullBAVL (BAVL AVL e
_ (EmptyBP Int#
_ )) = [Char] -> e
forall a. HasCallStack => [Char] -> a
error [Char]
"readFullBAVL: Empty BAVL."
pushBAVL :: e -> BAVL e -> AVL e
{-# INLINE pushBAVL #-}
pushBAVL :: forall e. e -> BAVL e -> AVL e
pushBAVL e
e (BAVL AVL e
t (FullBP Int#
p e
_)) = Int# -> e -> AVL e -> AVL e
forall e. Int# -> e -> AVL e -> AVL e
writePath Int#
p e
e AVL e
t
pushBAVL e
e (BAVL AVL e
t (EmptyBP Int#
p )) = Int# -> e -> AVL e -> AVL e
forall e. Int# -> e -> AVL e -> AVL e
insertPath Int#
p e
e AVL e
t
deleteBAVL :: BAVL e -> AVL e
{-# INLINE deleteBAVL #-}
deleteBAVL :: forall e. BAVL e -> AVL e
deleteBAVL (BAVL AVL e
t (FullBP Int#
p e
_)) = Int# -> AVL e -> AVL e
forall e. Int# -> AVL e -> AVL e
deletePath Int#
p AVL e
t
deleteBAVL (BAVL AVL e
t (EmptyBP Int#
_ )) = AVL e
t
fullBAVLtoZAVL :: BAVL e -> ZAVL e
fullBAVLtoZAVL :: forall e. BAVL e -> ZAVL e
fullBAVLtoZAVL (BAVL AVL e
t (FullBP Int#
i e
_)) = Int# -> Path e -> Int# -> AVL e -> ZAVL e
forall e. Int# -> Path e -> Int# -> AVL e -> ZAVL e
openFull Int#
i Path e
forall e. Path e
EP L(0AVL e
) t
fullBAVLtoZAVL (BAVL AVL e
_ (EmptyBP Int#
_ )) = [Char] -> ZAVL e
forall a. HasCallStack => [Char] -> a
error [Char]
"fullBAVLtoZAVL: Empty BAVL."
openFull :: UINT -> (Path e) -> UINT -> AVL e -> ZAVL e
openFull :: forall e. Int# -> Path e -> Int# -> AVL e -> ZAVL e
openFull Int#
_ Path e
_ Int#
_ AVL e
E = [Char] -> ZAVL e
forall a. HasCallStack => [Char] -> a
error [Char]
"openFull: Bug0."
openFull Int#
i Path e
p Int#
h (N AVL e
l e
e AVL e
r) = case Int# -> Ordering
sel Int#
i of
Ordering
LT -> let p_ :: Path e
p_ = Path e -> e -> AVL e -> Int# -> Path e
forall e. Path e -> e -> AVL e -> Int# -> Path e
LP Path e
p e
e AVL e
r DECINT1(h) in p_ `seq` openFull (goL i) p_ DECINT2(hAVL e
) l
Ordering
EQ -> Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
forall e. Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
ZAVL Path e
p AVL e
l DECINT2(h) e r DECINT1(h)
Ordering
GT -> let p_ :: Path e
p_ = Path e -> e -> AVL e -> Int# -> Path e
forall e. Path e -> e -> AVL e -> Int# -> Path e
RP Path e
p e
e AVL e
l DECINT2(h) in p_ `seq` openFull (goR i) p_ DECINT1(hAVL e
) r
openFull Int#
i Path e
p Int#
h (Z AVL e
l e
e AVL e
r) = case Int# -> Ordering
sel Int#
i of
Ordering
LT -> let p_ :: Path e
p_ = Path e -> e -> AVL e -> Int# -> Path e
forall e. Path e -> e -> AVL e -> Int# -> Path e
LP Path e
p e
e AVL e
r DECINT1(h) in p_ `seq` openFull (goL i) p_ DECINT1(hAVL e
) l
Ordering
EQ -> Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
forall e. Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
ZAVL Path e
p AVL e
l DECINT1(h) e r DECINT1(h)
Ordering
GT -> let p_ :: Path e
p_ = Path e -> e -> AVL e -> Int# -> Path e
forall e. Path e -> e -> AVL e -> Int# -> Path e
RP Path e
p e
e AVL e
l DECINT1(h) in p_ `seq` openFull (goR i) p_ DECINT1(hAVL e
) r
openFull Int#
i Path e
p Int#
h (P AVL e
l e
e AVL e
r) = case Int# -> Ordering
sel Int#
i of
Ordering
LT -> let p_ :: Path e
p_ = Path e -> e -> AVL e -> Int# -> Path e
forall e. Path e -> e -> AVL e -> Int# -> Path e
LP Path e
p e
e AVL e
r DECINT2(h) in p_ `seq` openFull (goL i) p_ DECINT1(hAVL e
) l
Ordering
EQ -> Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
forall e. Path e -> AVL e -> Int# -> e -> AVL e -> Int# -> ZAVL e
ZAVL Path e
p AVL e
l DECINT1(h) e r DECINT2(h)
Ordering
GT -> let p_ :: Path e
p_ = Path e -> e -> AVL e -> Int# -> Path e
forall e. Path e -> e -> AVL e -> Int# -> Path e
RP Path e
p e
e AVL e
l DECINT1(h) in p_ `seq` openFull (goR i) p_ DECINT2(hAVL e
) r
emptyBAVLtoPAVL :: BAVL e -> PAVL e
emptyBAVLtoPAVL :: forall e. BAVL e -> PAVL e
emptyBAVLtoPAVL (BAVL AVL e
_ (FullBP Int#
_ e
_)) = [Char] -> PAVL e
forall a. HasCallStack => [Char] -> a
error [Char]
"emptyBAVLtoPAVL: Full BAVL."
emptyBAVLtoPAVL (BAVL AVL e
t (EmptyBP Int#
i )) = Int# -> Path e -> Int# -> AVL e -> PAVL e
forall e. Int# -> Path e -> Int# -> AVL e -> PAVL e
openEmpty Int#
i Path e
forall e. Path e
EP L(0AVL e
) t
openEmpty :: UINT -> (Path e) -> UINT -> AVL e -> PAVL e
openEmpty :: forall e. Int# -> Path e -> Int# -> AVL e -> PAVL e
openEmpty Int#
_ Path e
p Int#
h AVL e
E = Path e -> Int# -> PAVL e
forall e. Path e -> Int# -> PAVL e
PAVL Path e
p Int#
h
openEmpty Int#
i Path e
p Int#
h (N AVL e
l e
e AVL e
r) = case Int# -> Ordering
sel Int#
i of
Ordering
LT -> let p_ :: Path e
p_ = Path e -> e -> AVL e -> Int# -> Path e
forall e. Path e -> e -> AVL e -> Int# -> Path e
LP Path e
p e
e AVL e
r DECINT1(h) in p_ `seq` openEmpty (goL i) p_ DECINT2(hAVL e
) l
Ordering
EQ -> [Char] -> PAVL e
forall a. HasCallStack => [Char] -> a
error [Char]
"openEmpty: Bug0"
Ordering
GT -> let p_ :: Path e
p_ = Path e -> e -> AVL e -> Int# -> Path e
forall e. Path e -> e -> AVL e -> Int# -> Path e
RP Path e
p e
e AVL e
l DECINT2(h) in p_ `seq` openEmpty (goR i) p_ DECINT1(hAVL e
) r
openEmpty Int#
i Path e
p Int#
h (Z AVL e
l e
e AVL e
r) = case Int# -> Ordering
sel Int#
i of
Ordering
LT -> let p_ :: Path e
p_ = Path e -> e -> AVL e -> Int# -> Path e
forall e. Path e -> e -> AVL e -> Int# -> Path e
LP Path e
p e
e AVL e
r DECINT1(h) in p_ `seq` openEmpty (goL i) p_ DECINT1(hAVL e
) l
Ordering
EQ -> [Char] -> PAVL e
forall a. HasCallStack => [Char] -> a
error [Char]
"openEmpty: Bug1"
Ordering
GT -> let p_ :: Path e
p_ = Path e -> e -> AVL e -> Int# -> Path e
forall e. Path e -> e -> AVL e -> Int# -> Path e
RP Path e
p e
e AVL e
l DECINT1(h) in p_ `seq` openEmpty (goR i) p_ DECINT1(hAVL e
) r
openEmpty Int#
i Path e
p Int#
h (P AVL e
l e
e AVL e
r) = case Int# -> Ordering
sel Int#
i of
Ordering
LT -> let p_ :: Path e
p_ = Path e -> e -> AVL e -> Int# -> Path e
forall e. Path e -> e -> AVL e -> Int# -> Path e
LP Path e
p e
e AVL e
r DECINT2(h) in p_ `seq` openEmpty (goL i) p_ DECINT1(hAVL e
) l
Ordering
EQ -> [Char] -> PAVL e
forall a. HasCallStack => [Char] -> a
error [Char]
"openEmpty: Bug2"
Ordering
GT -> let p_ :: Path e
p_ = Path e -> e -> AVL e -> Int# -> Path e
forall e. Path e -> e -> AVL e -> Int# -> Path e
RP Path e
p e
e AVL e
l DECINT1(h) in p_ `seq` openEmpty (goR i) p_ DECINT2(hAVL e
) r
anyBAVLtoEither :: BAVL e -> Either (PAVL e) (ZAVL e)
anyBAVLtoEither :: forall e. BAVL e -> Either (PAVL e) (ZAVL e)
anyBAVLtoEither (BAVL AVL e
t (FullBP Int#
i e
_)) = ZAVL e -> Either (PAVL e) (ZAVL e)
forall a b. b -> Either a b
Right (Int# -> Path e -> Int# -> AVL e -> ZAVL e
forall e. Int# -> Path e -> Int# -> AVL e -> ZAVL e
openFull Int#
i Path e
forall e. Path e
EP L(0AVL e
) t)
anyBAVLtoEither (BAVL AVL e
t (EmptyBP Int#
i )) = PAVL e -> Either (PAVL e) (ZAVL e)
forall a b. a -> Either a b
Left (Int# -> Path e -> Int# -> AVL e -> PAVL e
forall e. Int# -> Path e -> Int# -> AVL e -> PAVL e
openEmpty Int#
i Path e
forall e. Path e
EP L(0AVL e
) t)