module Data.Tree.AVL.BinPath
(BinPath(..),findFullPath,findEmptyPath,openPath,openPathWith,readPath,writePath,insertPath,
sel,goL,goR,
) where
import Data.Tree.AVL.Internals.Types(AVL(..))
import Data.COrdering
import GHC.Base
#include "ghcdefs.h"
bit0 :: Int# -> Bool
{-# INLINE bit0 #-}
bit0 :: Int# -> Bool
bit0 Int#
p = Int# -> Bool
isTrue# (Word# -> Int#
word2Int# (Word# -> Word# -> Word#
and# (Int# -> Word#
int2Word# Int#
p) (Int# -> Word#
int2Word# Int#
1#)) Int# -> Int# -> Int#
==# Int#
1#)
sel :: Int# -> Ordering
{-# INLINE sel #-}
sel :: Int# -> Ordering
sel Int#
p = if Int# -> Bool
isTrue# (Int#
p Int# -> Int# -> Int#
==# Int#
0#) then Ordering
EQ
else if Int# -> Bool
bit0 Int#
p then Ordering
LT
else Ordering
GT
goL :: Int# -> Int#
{-# INLINE goL #-}
goL :: Int# -> Int#
goL Int#
p = Int# -> Int# -> Int#
iShiftRL# Int#
p Int#
1#
goR :: Int# -> Int#
{-# INLINE goR #-}
goR :: Int# -> Int#
goR Int#
p = Int# -> Int# -> Int#
iShiftRL# (Int#
p Int# -> Int# -> Int#
-# Int#
1#) Int#
1#
data BinPath a = FullBP {-# UNPACK #-} !UINT a
| EmptyBP {-# UNPACK #-} !UINT
findFullPath :: (e -> Ordering) -> AVL e -> UINT
findFullPath :: forall e. (e -> Ordering) -> AVL e -> Int#
findFullPath e -> Ordering
c AVL e
t = Int# -> Int# -> AVL e -> Int#
find L(1) LAVL e
(0) t where
find :: Int# -> Int# -> AVL e -> Int#
find Int#
_ Int#
_ AVL e
E = L(-1)
find Int#
d Int#
i (N AVL e
l e
e AVL e
r) = Int# -> Int# -> AVL e -> e -> AVL e -> Int#
find' Int#
d Int#
i AVL e
l e
e AVL e
r
find Int#
d Int#
i (Z AVL e
l e
e AVL e
r) = Int# -> Int# -> AVL e -> e -> AVL e -> Int#
find' Int#
d Int#
i AVL e
l e
e AVL e
r
find Int#
d Int#
i (P AVL e
l e
e AVL e
r) = Int# -> Int# -> AVL e -> e -> AVL e -> Int#
find' Int#
d Int#
i AVL e
l e
e AVL e
r
find' :: Int# -> Int# -> AVL e -> e -> AVL e -> Int#
find' Int#
d Int#
i AVL e
l e
e AVL e
r = case e -> Ordering
c e
e of
Ordering
LT -> let d_ :: Int#
d_ = ADDINT(d,d) in find d_ ADDINT(i,d AVL e
) l
Ordering
EQ -> Int#
i
Ordering
GT -> let d_ :: Int#
d_ = ADDINT(d,d) in find d_ ADDINT(i,d_AVL e
) r
findEmptyPath :: (e -> Ordering) -> AVL e -> UINT
findEmptyPath :: forall e. (e -> Ordering) -> AVL e -> Int#
findEmptyPath e -> Ordering
c AVL e
t = Int# -> Int# -> AVL e -> Int#
find L(1) LAVL e
(0) t where
find :: Int# -> Int# -> AVL e -> Int#
find Int#
_ Int#
i AVL e
E = Int#
i
find Int#
d Int#
i (N AVL e
l e
e AVL e
r) = Int# -> Int# -> AVL e -> e -> AVL e -> Int#
find' Int#
d Int#
i AVL e
l e
e AVL e
r
find Int#
d Int#
i (Z AVL e
l e
e AVL e
r) = Int# -> Int# -> AVL e -> e -> AVL e -> Int#
find' Int#
d Int#
i AVL e
l e
e AVL e
r
find Int#
d Int#
i (P AVL e
l e
e AVL e
r) = Int# -> Int# -> AVL e -> e -> AVL e -> Int#
find' Int#
d Int#
i AVL e
l e
e AVL e
r
find' :: Int# -> Int# -> AVL e -> e -> AVL e -> Int#
find' Int#
d Int#
i AVL e
l e
e AVL e
r = case e -> Ordering
c e
e of
Ordering
LT -> let d_ :: Int#
d_ = ADDINT(d,d) in find d_ ADDINT(i,d AVL e
) l
Ordering
EQ -> L(-1)
Ordering
GT -> let d_ :: Int#
d_ = ADDINT(d,d) in find d_ ADDINT(i,d_AVL e
) r
openPath :: (e -> Ordering) -> AVL e -> BinPath e
openPath :: forall e. (e -> Ordering) -> AVL e -> BinPath e
openPath e -> Ordering
c AVL e
t = Int# -> Int# -> AVL e -> BinPath e
find L(1) LAVL e
(0) t where
find :: Int# -> Int# -> AVL e -> BinPath e
find Int#
_ Int#
i AVL e
E = Int# -> BinPath e
forall a. Int# -> BinPath a
EmptyBP Int#
i
find Int#
d Int#
i (N AVL e
l e
e AVL e
r) = Int# -> Int# -> AVL e -> e -> AVL e -> BinPath e
find' Int#
d Int#
i AVL e
l e
e AVL e
r
find Int#
d Int#
i (Z AVL e
l e
e AVL e
r) = Int# -> Int# -> AVL e -> e -> AVL e -> BinPath e
find' Int#
d Int#
i AVL e
l e
e AVL e
r
find Int#
d Int#
i (P AVL e
l e
e AVL e
r) = Int# -> Int# -> AVL e -> e -> AVL e -> BinPath e
find' Int#
d Int#
i AVL e
l e
e AVL e
r
find' :: Int# -> Int# -> AVL e -> e -> AVL e -> BinPath e
find' Int#
d Int#
i AVL e
l e
e AVL e
r = case e -> Ordering
c e
e of
Ordering
LT -> let d_ :: Int#
d_ = ADDINT(d,d) in find d_ ADDINT(i,d AVL e
) l
Ordering
EQ -> Int# -> e -> BinPath e
forall a. Int# -> a -> BinPath a
FullBP Int#
i e
e
Ordering
GT -> let d_ :: Int#
d_ = ADDINT(d,d) in find d_ ADDINT(i,d_AVL e
) r
openPathWith :: (e -> COrdering a) -> AVL e -> BinPath a
openPathWith :: forall e a. (e -> COrdering a) -> AVL e -> BinPath a
openPathWith e -> COrdering a
c AVL e
t = Int# -> Int# -> AVL e -> BinPath a
find L(1) LAVL e
(0) t where
find :: Int# -> Int# -> AVL e -> BinPath a
find Int#
_ Int#
i AVL e
E = Int# -> BinPath a
forall a. Int# -> BinPath a
EmptyBP Int#
i
find Int#
d Int#
i (N AVL e
l e
e AVL e
r) = Int# -> Int# -> AVL e -> e -> AVL e -> BinPath a
find' Int#
d Int#
i AVL e
l e
e AVL e
r
find Int#
d Int#
i (Z AVL e
l e
e AVL e
r) = Int# -> Int# -> AVL e -> e -> AVL e -> BinPath a
find' Int#
d Int#
i AVL e
l e
e AVL e
r
find Int#
d Int#
i (P AVL e
l e
e AVL e
r) = Int# -> Int# -> AVL e -> e -> AVL e -> BinPath a
find' Int#
d Int#
i AVL e
l e
e AVL e
r
find' :: Int# -> Int# -> AVL e -> e -> AVL e -> BinPath a
find' Int#
d Int#
i AVL e
l e
e AVL e
r = case e -> COrdering a
c e
e of
COrdering a
Lt -> let d_ :: Int#
d_ = ADDINT(d,d) in find d_ ADDINT(i,d AVL e
) l
Eq a
a -> Int# -> a -> BinPath a
forall a. Int# -> a -> BinPath a
FullBP Int#
i a
a
COrdering a
Gt -> let d_ :: Int#
d_ = ADDINT(d,d) in find d_ ADDINT(i,d_AVL e
) r
writePath :: UINT -> e -> AVL e -> AVL e
writePath :: forall e. Int# -> e -> AVL e -> AVL e
writePath Int#
i0 e
e' AVL e
t = Int# -> AVL e -> AVL e
wp Int#
i0 AVL e
t where
wp :: Int# -> AVL e -> AVL e
wp L(0) E = error "writePath: Bug0"
wp L(0) (AVL e
N e
l AVL e
_ r) AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
= AVL e
N l e' r
wp L(0) (AVL e
Z e
l AVL e
_ r) AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
= AVL e
Z l e' r
wp L(0) (AVL e
P e
l AVL e
_ r) AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
= AVL e
P l e' r
wp Int#
_ AVL e
E = [Char] -> AVL e
forall a. HasCallStack => [Char] -> a
error [Char]
"writePath: Bug1"
wp Int#
i (N AVL e
l e
e AVL e
r) = if Int# -> Bool
bit0 Int#
i then let l' :: AVL e
l' = Int# -> AVL e -> AVL e
wp (Int# -> Int#
goL Int#
i) AVL e
l in AVL e
l' AVL e -> AVL e -> AVL e
forall a b. a -> b -> b
`seq` AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
N AVL e
l' e
e AVL e
r
else let r' :: AVL e
r' = Int# -> AVL e -> AVL e
wp (Int# -> Int#
goR Int#
i) AVL e
r in AVL e
r' AVL e -> AVL e -> AVL e
forall a b. a -> b -> b
`seq` AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
N AVL e
l e
e AVL e
r'
wp Int#
i (Z AVL e
l e
e AVL e
r) = if Int# -> Bool
bit0 Int#
i then let l' :: AVL e
l' = Int# -> AVL e -> AVL e
wp (Int# -> Int#
goL Int#
i) AVL e
l in AVL e
l' AVL e -> AVL e -> AVL e
forall a b. a -> b -> b
`seq` AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
Z AVL e
l' e
e AVL e
r
else let r' :: AVL e
r' = Int# -> AVL e -> AVL e
wp (Int# -> Int#
goR Int#
i) AVL e
r in AVL e
r' AVL e -> AVL e -> AVL e
forall a b. a -> b -> b
`seq` AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
Z AVL e
l e
e AVL e
r'
wp Int#
i (P AVL e
l e
e AVL e
r) = if Int# -> Bool
bit0 Int#
i then let l' :: AVL e
l' = Int# -> AVL e -> AVL e
wp (Int# -> Int#
goL Int#
i) AVL e
l in AVL e
l' AVL e -> AVL e -> AVL e
forall a b. a -> b -> b
`seq` AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
P AVL e
l' e
e AVL e
r
else let r' :: AVL e
r' = Int# -> AVL e -> AVL e
wp (Int# -> Int#
goR Int#
i) AVL e
r in AVL e
r' AVL e -> AVL e -> AVL e
forall a b. a -> b -> b
`seq` AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
P AVL e
l e
e AVL e
r'
readPath :: UINT -> AVL e -> e
readPath :: forall e. Int# -> AVL e -> e
readPath L(0) E = error "readPath: Bug0"
readPath L(0) (AVL e
N e
_ AVL e
e _) e
= e
readPath L(0) (AVL e
Z e
_ AVL e
e _) e
= e
readPath L(0) (AVL e
P e
_ AVL e
e _) e
= e
readPath Int#
_ AVL e
E = [Char] -> e
forall a. HasCallStack => [Char] -> a
error [Char]
"readPath: Bug1"
readPath Int#
i (N AVL e
l e
_ AVL e
r) = Int# -> AVL e -> AVL e -> e
forall e. Int# -> AVL e -> AVL e -> e
readPath_ Int#
i AVL e
l AVL e
r
readPath Int#
i (Z AVL e
l e
_ AVL e
r) = Int# -> AVL e -> AVL e -> e
forall e. Int# -> AVL e -> AVL e -> e
readPath_ Int#
i AVL e
l AVL e
r
readPath Int#
i (P AVL e
l e
_ AVL e
r) = Int# -> AVL e -> AVL e -> e
forall e. Int# -> AVL e -> AVL e -> e
readPath_ Int#
i AVL e
l AVL e
r
readPath_ :: UINT -> AVL e -> AVL e -> e
readPath_ :: forall e. Int# -> AVL e -> AVL e -> e
readPath_ Int#
i AVL e
l AVL e
r = if Int# -> Bool
bit0 Int#
i then Int# -> AVL e -> e
forall e. Int# -> AVL e -> e
readPath (Int# -> Int#
goL Int#
i) AVL e
l
else Int# -> AVL e -> e
forall e. Int# -> AVL e -> e
readPath (Int# -> Int#
goR Int#
i) AVL e
r
insertPath :: UINT -> e -> AVL e -> AVL e
insertPath :: forall e. Int# -> e -> AVL e -> AVL e
insertPath Int#
i0 e
e0 AVL e
t = Int# -> AVL e -> AVL e
put Int#
i0 AVL e
t where
put :: Int# -> AVL e -> AVL e
put Int#
_ AVL e
E = 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
e0 AVL e
forall e. AVL e
E
put Int#
i (N AVL e
l e
e AVL e
r) = Int# -> AVL e -> e -> AVL e -> AVL e
putN Int#
i AVL e
l e
e AVL e
r
put Int#
i (Z AVL e
l e
e AVL e
r) = Int# -> AVL e -> e -> AVL e -> AVL e
putZ Int#
i AVL e
l e
e AVL e
r
put Int#
i (P AVL e
l e
e AVL e
r) = Int# -> AVL e -> e -> AVL e -> AVL e
putP Int#
i AVL e
l e
e AVL e
r
putN :: Int# -> AVL e -> e -> AVL e -> AVL e
putN Int#
i AVL e
l e
e AVL e
r = if Int# -> Bool
bit0 Int#
i then Int# -> AVL e -> e -> AVL e -> AVL e
putNL Int#
i AVL e
l e
e AVL e
r
else Int# -> AVL e -> e -> AVL e -> AVL e
putNR Int#
i AVL e
l e
e AVL e
r
putZ :: Int# -> AVL e -> e -> AVL e -> AVL e
putZ Int#
i AVL e
l e
e AVL e
r = if Int# -> Bool
bit0 Int#
i then Int# -> AVL e -> e -> AVL e -> AVL e
putZL Int#
i AVL e
l e
e AVL e
r
else Int# -> AVL e -> e -> AVL e -> AVL e
putZR Int#
i AVL e
l e
e AVL e
r
putP :: Int# -> AVL e -> e -> AVL e -> AVL e
putP Int#
i AVL e
l e
e AVL e
r = if Int# -> Bool
bit0 Int#
i then Int# -> AVL e -> e -> AVL e -> AVL e
putPL Int#
i AVL e
l e
e AVL e
r
else Int# -> AVL e -> e -> AVL e -> AVL e
putPR Int#
i AVL e
l e
e AVL e
r
{-# INLINE putNL #-}
putNL :: Int# -> AVL e -> e -> AVL e -> AVL e
putNL Int#
_ AVL e
E e
e AVL e
r = AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
Z (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
e0 AVL e
forall e. AVL e
E) e
e AVL e
r
putNL Int#
i (N AVL e
ll e
le AVL e
lr) e
e AVL e
r = let l' :: AVL e
l' = Int# -> AVL e -> e -> AVL e -> AVL e
putN (Int# -> Int#
goL Int#
i) AVL e
ll e
le AVL e
lr
in AVL e
l' AVL e -> AVL e -> AVL e
forall a b. a -> b -> b
`seq` AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
N AVL e
l' e
e AVL e
r
putNL Int#
i (P AVL e
ll e
le AVL e
lr) e
e AVL e
r = let l' :: AVL e
l' = Int# -> AVL e -> e -> AVL e -> AVL e
putP (Int# -> Int#
goL Int#
i) AVL e
ll e
le AVL e
lr
in AVL e
l' AVL e -> AVL e -> AVL e
forall a b. a -> b -> b
`seq` AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
N AVL e
l' e
e AVL e
r
putNL Int#
i (Z AVL e
ll e
le AVL e
lr) e
e AVL e
r = let l' :: AVL e
l' = Int# -> AVL e -> e -> AVL e -> AVL e
putZ (Int# -> Int#
goL Int#
i) AVL e
ll e
le AVL e
lr
in case AVL e
l' of
AVL e
E -> [Char] -> AVL e
forall a. HasCallStack => [Char] -> a
error [Char]
"insertPath: Bug0"
Z AVL e
_ e
_ AVL e
_ -> AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
N AVL e
l' e
e AVL e
r
AVL e
_ -> AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
Z AVL e
l' e
e AVL e
r
{-# INLINE putZL #-}
putZL :: Int# -> AVL e -> e -> AVL e -> AVL e
putZL Int#
_ AVL e
E e
e AVL e
r = AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL 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
e0 AVL e
forall e. AVL e
E) e
e AVL e
r
putZL Int#
i (N AVL e
ll e
le AVL e
lr) e
e AVL e
r = let l' :: AVL e
l' = Int# -> AVL e -> e -> AVL e -> AVL e
putN (Int# -> Int#
goL Int#
i) AVL e
ll e
le AVL e
lr
in AVL e
l' AVL e -> AVL e -> AVL e
forall a b. a -> b -> b
`seq` AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
Z AVL e
l' e
e AVL e
r
putZL Int#
i (P AVL e
ll e
le AVL e
lr) e
e AVL e
r = let l' :: AVL e
l' = Int# -> AVL e -> e -> AVL e -> AVL e
putP (Int# -> Int#
goL Int#
i) AVL e
ll e
le AVL e
lr
in AVL e
l' AVL e -> AVL e -> AVL e
forall a b. a -> b -> b
`seq` AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
Z AVL e
l' e
e AVL e
r
putZL Int#
i (Z AVL e
ll e
le AVL e
lr) e
e AVL e
r = let l' :: AVL e
l' = Int# -> AVL e -> e -> AVL e -> AVL e
putZ (Int# -> Int#
goL Int#
i) AVL e
ll e
le AVL e
lr
in case AVL e
l' of
AVL e
E -> [Char] -> AVL e
forall a. HasCallStack => [Char] -> a
error [Char]
"insertPath: Bug1"
Z AVL e
_ e
_ AVL e
_ -> AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
Z AVL e
l' e
e AVL e
r
AVL e
_ -> AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
P AVL e
l' e
e AVL e
r
{-# INLINE putZR #-}
putZR :: Int# -> AVL e -> e -> AVL e -> AVL e
putZR Int#
_ AVL e
l e
e AVL e
E = AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
N AVL e
l e
e (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
e0 AVL e
forall e. AVL e
E)
putZR Int#
i AVL e
l e
e (N AVL e
rl e
re AVL e
rr) = let r' :: AVL e
r' = Int# -> AVL e -> e -> AVL e -> AVL e
putN (Int# -> Int#
goR Int#
i) AVL e
rl e
re AVL e
rr
in AVL e
r' AVL e -> AVL e -> AVL e
forall a b. a -> b -> b
`seq` AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
Z AVL e
l e
e AVL e
r'
putZR Int#
i AVL e
l e
e (P AVL e
rl e
re AVL e
rr) = let r' :: AVL e
r' = Int# -> AVL e -> e -> AVL e -> AVL e
putP (Int# -> Int#
goR Int#
i) AVL e
rl e
re AVL e
rr
in AVL e
r' AVL e -> AVL e -> AVL e
forall a b. a -> b -> b
`seq` AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
Z AVL e
l e
e AVL e
r'
putZR Int#
i AVL e
l e
e (Z AVL e
rl e
re AVL e
rr) = let r' :: AVL e
r' = Int# -> AVL e -> e -> AVL e -> AVL e
putZ (Int# -> Int#
goR Int#
i) AVL e
rl e
re AVL e
rr
in case AVL e
r' of
AVL e
E -> [Char] -> AVL e
forall a. HasCallStack => [Char] -> a
error [Char]
"insertPath: Bug2"
Z AVL e
_ e
_ AVL e
_ -> AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
Z AVL e
l e
e AVL e
r'
AVL e
_ -> AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
N AVL e
l e
e AVL e
r'
{-# INLINE putPR #-}
putPR :: Int# -> AVL e -> e -> AVL e -> AVL e
putPR Int#
_ AVL e
l e
e AVL e
E = AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
Z AVL e
l e
e (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
e0 AVL e
forall e. AVL e
E)
putPR Int#
i AVL e
l e
e (N AVL e
rl e
re AVL e
rr) = let r' :: AVL e
r' = Int# -> AVL e -> e -> AVL e -> AVL e
putN (Int# -> Int#
goR Int#
i) AVL e
rl e
re AVL e
rr
in AVL e
r' AVL e -> AVL e -> AVL e
forall a b. a -> b -> b
`seq` AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
P AVL e
l e
e AVL e
r'
putPR Int#
i AVL e
l e
e (P AVL e
rl e
re AVL e
rr) = let r' :: AVL e
r' = Int# -> AVL e -> e -> AVL e -> AVL e
putP (Int# -> Int#
goR Int#
i) AVL e
rl e
re AVL e
rr
in AVL e
r' AVL e -> AVL e -> AVL e
forall a b. a -> b -> b
`seq` AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
P AVL e
l e
e AVL e
r'
putPR Int#
i AVL e
l e
e (Z AVL e
rl e
re AVL e
rr) = let r' :: AVL e
r' = Int# -> AVL e -> e -> AVL e -> AVL e
putZ (Int# -> Int#
goR Int#
i) AVL e
rl e
re AVL e
rr
in case AVL e
r' of
AVL e
E -> [Char] -> AVL e
forall a. HasCallStack => [Char] -> a
error [Char]
"insertPath: Bug3"
Z AVL e
_ e
_ AVL e
_ -> AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
P AVL e
l e
e AVL e
r'
AVL e
_ -> AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
Z AVL e
l e
e AVL e
r'
{-# INLINE putNR #-}
putNR :: Int# -> AVL e -> e -> AVL e -> AVL e
putNR Int#
_ AVL e
_ e
_ AVL e
E = [Char] -> AVL e
forall a. HasCallStack => [Char] -> a
error [Char]
"insertPath: Bug4"
putNR Int#
i AVL e
l e
e (N AVL e
rl e
re AVL e
rr) = let r' :: AVL e
r' = Int# -> AVL e -> e -> AVL e -> AVL e
putN (Int# -> Int#
goR Int#
i) AVL e
rl e
re AVL e
rr
in AVL e
r' AVL e -> AVL e -> AVL e
forall a b. a -> b -> b
`seq` AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
N AVL e
l e
e AVL e
r'
putNR Int#
i AVL e
l e
e (P AVL e
rl e
re AVL e
rr) = let r' :: AVL e
r' = Int# -> AVL e -> e -> AVL e -> AVL e
putP (Int# -> Int#
goR Int#
i) AVL e
rl e
re AVL e
rr
in AVL e
r' AVL e -> AVL e -> AVL e
forall a b. a -> b -> b
`seq` AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
N AVL e
l e
e AVL e
r'
putNR Int#
i AVL e
l e
e (Z AVL e
rl e
re AVL e
rr) = let i' :: Int#
i' = Int# -> Int#
goR Int#
i in if Int# -> Bool
bit0 Int#
i' then Int# -> AVL e -> e -> AVL e -> e -> AVL e -> AVL e
putNRL Int#
i' AVL e
l e
e AVL e
rl e
re AVL e
rr
else Int# -> AVL e -> e -> AVL e -> e -> AVL e -> AVL e
putNRR Int#
i' AVL e
l e
e AVL e
rl e
re AVL e
rr
{-# INLINE putPL #-}
putPL :: Int# -> AVL e -> e -> AVL e -> AVL e
putPL Int#
_ AVL e
E e
_ AVL e
_ = [Char] -> AVL e
forall a. HasCallStack => [Char] -> a
error [Char]
"insertPath: Bug5"
putPL Int#
i (N AVL e
ll e
le AVL e
lr) e
e AVL e
r = let l' :: AVL e
l' = Int# -> AVL e -> e -> AVL e -> AVL e
putN (Int# -> Int#
goL Int#
i) AVL e
ll e
le AVL e
lr
in AVL e
l' AVL e -> AVL e -> AVL e
forall a b. a -> b -> b
`seq` AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
P AVL e
l' e
e AVL e
r
putPL Int#
i (P AVL e
ll e
le AVL e
lr) e
e AVL e
r = let l' :: AVL e
l' = Int# -> AVL e -> e -> AVL e -> AVL e
putP (Int# -> Int#
goL Int#
i) AVL e
ll e
le AVL e
lr
in AVL e
l' AVL e -> AVL e -> AVL e
forall a b. a -> b -> b
`seq` AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
P AVL e
l' e
e AVL e
r
putPL Int#
i (Z AVL e
ll e
le AVL e
lr) e
e AVL e
r = let i' :: Int#
i' = Int# -> Int#
goL Int#
i in if Int# -> Bool
bit0 Int#
i' then Int# -> AVL e -> e -> AVL e -> e -> AVL e -> AVL e
putPLL Int#
i' AVL e
ll e
le AVL e
lr e
e AVL e
r
else Int# -> AVL e -> e -> AVL e -> e -> AVL e -> AVL e
putPLR Int#
i' AVL e
ll e
le AVL e
lr e
e AVL e
r
{-# INLINE putNRR #-}
putNRR :: Int# -> AVL e -> e -> AVL e -> e -> AVL e -> AVL e
putNRR Int#
_ AVL e
l e
e AVL e
rl e
re AVL e
E = AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
Z (AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
Z AVL e
l e
e AVL e
rl) e
re (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
e0 AVL e
forall e. AVL e
E)
putNRR Int#
i AVL e
l e
e AVL e
rl e
re (N AVL e
rrl e
rre AVL e
rrr) = let rr' :: AVL e
rr' = Int# -> AVL e -> e -> AVL e -> AVL e
putN (Int# -> Int#
goR Int#
i) AVL e
rrl e
rre AVL e
rrr
in AVL e
rr' AVL e -> AVL e -> AVL e
forall a b. a -> b -> b
`seq` AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
N AVL e
l e
e (AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
Z AVL e
rl e
re AVL e
rr')
putNRR Int#
i AVL e
l e
e AVL e
rl e
re (P AVL e
rrl e
rre AVL e
rrr) = let rr' :: AVL e
rr' = Int# -> AVL e -> e -> AVL e -> AVL e
putP (Int# -> Int#
goR Int#
i) AVL e
rrl e
rre AVL e
rrr
in AVL e
rr' AVL e -> AVL e -> AVL e
forall a b. a -> b -> b
`seq` AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
N AVL e
l e
e (AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
Z AVL e
rl e
re AVL e
rr')
putNRR Int#
i AVL e
l e
e AVL e
rl e
re (Z AVL e
rrl e
rre AVL e
rrr) = let rr' :: AVL e
rr' = Int# -> AVL e -> e -> AVL e -> AVL e
putZ (Int# -> Int#
goR Int#
i) AVL e
rrl e
rre AVL e
rrr
in case AVL e
rr' of
AVL e
E -> [Char] -> AVL e
forall a. HasCallStack => [Char] -> a
error [Char]
"insertPath: Bug6"
Z AVL e
_ e
_ AVL e
_ -> AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
N AVL e
l e
e (AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
Z AVL e
rl e
re AVL e
rr')
AVL e
_ -> AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
Z (AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
Z AVL e
l e
e AVL e
rl) e
re AVL e
rr'
{-# INLINE putPLL #-}
putPLL :: Int# -> AVL e -> e -> AVL e -> e -> AVL e -> AVL e
putPLL Int#
_ AVL e
E e
le AVL e
lr e
e AVL e
r = AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
Z (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
e0 AVL e
forall e. AVL e
E) e
le (AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
Z AVL e
lr e
e AVL e
r)
putPLL Int#
i (N AVL e
lll e
lle AVL e
llr) e
le AVL e
lr e
e AVL e
r = let ll' :: AVL e
ll' = Int# -> AVL e -> e -> AVL e -> AVL e
putN (Int# -> Int#
goL Int#
i) AVL e
lll e
lle AVL e
llr
in AVL e
ll' AVL e -> AVL e -> AVL e
forall a b. a -> b -> b
`seq` AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
P (AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
Z AVL e
ll' e
le AVL e
lr) e
e AVL e
r
putPLL Int#
i (P AVL e
lll e
lle AVL e
llr) e
le AVL e
lr e
e AVL e
r = let ll' :: AVL e
ll' = Int# -> AVL e -> e -> AVL e -> AVL e
putP (Int# -> Int#
goL Int#
i) AVL e
lll e
lle AVL e
llr
in AVL e
ll' AVL e -> AVL e -> AVL e
forall a b. a -> b -> b
`seq` AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
P (AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
Z AVL e
ll' e
le AVL e
lr) e
e AVL e
r
putPLL Int#
i (Z AVL e
lll e
lle AVL e
llr) e
le AVL e
lr e
e AVL e
r = let ll' :: AVL e
ll' = Int# -> AVL e -> e -> AVL e -> AVL e
putZ (Int# -> Int#
goL Int#
i) AVL e
lll e
lle AVL e
llr
in case AVL e
ll' of
AVL e
E -> [Char] -> AVL e
forall a. HasCallStack => [Char] -> a
error [Char]
"insertPath: Bug7"
Z AVL e
_ e
_ AVL e
_ -> AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
P (AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
Z AVL e
ll' e
le AVL e
lr) e
e AVL e
r
AVL e
_ -> AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
Z AVL e
ll' e
le (AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
Z AVL e
lr e
e AVL e
r)
{-# INLINE putNRL #-}
putNRL :: Int# -> AVL e -> e -> AVL e -> e -> AVL e -> AVL e
putNRL Int#
_ AVL e
l e
e AVL e
E e
re AVL e
rr = AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
Z (AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
Z AVL e
l e
e AVL e
forall e. AVL e
E) e
e0 (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
re AVL e
rr)
putNRL Int#
i AVL e
l e
e (N AVL e
rll e
rle AVL e
rlr) e
re AVL e
rr = let rl' :: AVL e
rl' = Int# -> AVL e -> e -> AVL e -> AVL e
putN (Int# -> Int#
goL Int#
i) AVL e
rll e
rle AVL e
rlr
in AVL e
rl' AVL e -> AVL e -> AVL e
forall a b. a -> b -> b
`seq` AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
N AVL e
l e
e (AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
Z AVL e
rl' e
re AVL e
rr)
putNRL Int#
i AVL e
l e
e (P AVL e
rll e
rle AVL e
rlr) e
re AVL e
rr = let rl' :: AVL e
rl' = Int# -> AVL e -> e -> AVL e -> AVL e
putP (Int# -> Int#
goL Int#
i) AVL e
rll e
rle AVL e
rlr
in AVL e
rl' AVL e -> AVL e -> AVL e
forall a b. a -> b -> b
`seq` AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
N AVL e
l e
e (AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
Z AVL e
rl' e
re AVL e
rr)
putNRL Int#
i AVL e
l e
e (Z AVL e
rll e
rle AVL e
rlr) e
re AVL e
rr = let rl' :: AVL e
rl' = Int# -> AVL e -> e -> AVL e -> AVL e
putZ (Int# -> Int#
goL Int#
i) AVL e
rll e
rle AVL e
rlr
in case AVL e
rl' of
AVL e
E -> [Char] -> AVL e
forall a. HasCallStack => [Char] -> a
error [Char]
"insertPath: Bug8"
Z AVL e
_ e
_ AVL e
_ -> AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
N AVL e
l e
e (AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
Z AVL e
rl' e
re AVL e
rr)
N AVL e
rll' e
rle' AVL e
rlr' -> AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
Z (AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
P AVL e
l e
e AVL e
rll') e
rle' (AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
Z AVL e
rlr' e
re AVL e
rr)
P AVL e
rll' e
rle' AVL e
rlr' -> AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
Z (AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
Z AVL e
l e
e AVL e
rll') e
rle' (AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
N AVL e
rlr' e
re AVL e
rr)
{-# INLINE putPLR #-}
putPLR :: Int# -> AVL e -> e -> AVL e -> e -> AVL e -> AVL e
putPLR Int#
_ AVL e
ll e
le AVL e
E e
e AVL e
r = AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
Z (AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
Z AVL e
ll e
le AVL e
forall e. AVL e
E) e
e0 (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
r)
putPLR Int#
i AVL e
ll e
le (N AVL e
lrl e
lre AVL e
lrr) e
e AVL e
r = let lr' :: AVL e
lr' = Int# -> AVL e -> e -> AVL e -> AVL e
putN (Int# -> Int#
goR Int#
i) AVL e
lrl e
lre AVL e
lrr
in AVL e
lr' AVL e -> AVL e -> AVL e
forall a b. a -> b -> b
`seq` AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
P (AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
Z AVL e
ll e
le AVL e
lr') e
e AVL e
r
putPLR Int#
i AVL e
ll e
le (P AVL e
lrl e
lre AVL e
lrr) e
e AVL e
r = let lr' :: AVL e
lr' = Int# -> AVL e -> e -> AVL e -> AVL e
putP (Int# -> Int#
goR Int#
i) AVL e
lrl e
lre AVL e
lrr
in AVL e
lr' AVL e -> AVL e -> AVL e
forall a b. a -> b -> b
`seq` AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
P (AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
Z AVL e
ll e
le AVL e
lr') e
e AVL e
r
putPLR Int#
i AVL e
ll e
le (Z AVL e
lrl e
lre AVL e
lrr) e
e AVL e
r = let lr' :: AVL e
lr' = Int# -> AVL e -> e -> AVL e -> AVL e
putZ (Int# -> Int#
goR Int#
i) AVL e
lrl e
lre AVL e
lrr
in case AVL e
lr' of
AVL e
E -> [Char] -> AVL e
forall a. HasCallStack => [Char] -> a
error [Char]
"insertPath: Bug9"
Z AVL e
_ e
_ AVL e
_ -> AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
P (AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
Z AVL e
ll e
le AVL e
lr') e
e AVL e
r
N AVL e
lrl' e
lre' AVL e
lrr' -> AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
Z (AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
P AVL e
ll e
le AVL e
lrl') e
lre' (AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
Z AVL e
lrr' e
e AVL e
r)
P AVL e
lrl' e
lre' AVL e
lrr' -> AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
Z (AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
Z AVL e
ll e
le AVL e
lrl') e
lre' (AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
N AVL e
lrr' e
e AVL e
r)