{-# OPTIONS_HADDOCK hide #-}
module Data.Tree.AVL.Delete
(
delL,delR,assertDelL,assertDelR,tryDelL,tryDelR,
delete,deleteFast,deleteIf,deleteMaybe,
assertPopL,assertPopR,tryPopL,tryPopR,
assertPop,tryPop,assertPopMaybe,tryPopMaybe,assertPopIf,tryPopIf,
) where
import Data.COrdering
import Data.Tree.AVL.Internals.Types(AVL(..))
import Data.Tree.AVL.BinPath(BinPath(..),findFullPath,openPathWith,writePath)
import Data.Tree.AVL.Internals.DelUtils
(
delRN,delRZ,delRP,delLN,delLZ,delLP,
popRN,popRZ,popRP,popLN,popLZ,popLP,
chkLN,chkLZ,chkLP,chkRN,chkRZ,chkRP,
chkLN',chkLZ',chkLP',chkRN',chkRZ',chkRP',
subN,subZR,subZL,subP,
deletePath
)
#include "ghcdefs.h"
delL :: AVL e -> AVL e
delL :: forall e. AVL e -> AVL e
delL AVL e
E = AVL e
forall e. AVL e
E
delL (N AVL e
l e
e AVL e
r) = AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
delLN AVL e
l e
e AVL e
r
delL (Z AVL e
l e
e AVL e
r) = AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
delLZ AVL e
l e
e AVL e
r
delL (P AVL e
l e
e AVL e
r) = AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
delLP AVL e
l e
e AVL e
r
assertDelL :: AVL e -> AVL e
assertDelL :: forall e. AVL e -> AVL e
assertDelL AVL e
E = [Char] -> AVL e
forall a. HasCallStack => [Char] -> a
error [Char]
"assertDelL: Empty tree."
assertDelL (N AVL e
l e
e AVL e
r) = AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
delLN AVL e
l e
e AVL e
r
assertDelL (Z AVL e
l e
e AVL e
r) = AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
delLZ AVL e
l e
e AVL e
r
assertDelL (P AVL e
l e
e AVL e
r) = AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
delLP AVL e
l e
e AVL e
r
tryDelL :: AVL e -> Maybe (AVL e)
tryDelL :: forall e. AVL e -> Maybe (AVL e)
tryDelL AVL e
E = Maybe (AVL e)
forall a. Maybe a
Nothing
tryDelL (N AVL e
l e
e AVL e
r) = AVL e -> Maybe (AVL e)
forall a. a -> Maybe a
Just (AVL e -> Maybe (AVL e)) -> AVL e -> Maybe (AVL e)
forall a b. (a -> b) -> a -> b
$! AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
delLN AVL e
l e
e AVL e
r
tryDelL (Z AVL e
l e
e AVL e
r) = AVL e -> Maybe (AVL e)
forall a. a -> Maybe a
Just (AVL e -> Maybe (AVL e)) -> AVL e -> Maybe (AVL e)
forall a b. (a -> b) -> a -> b
$! AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
delLZ AVL e
l e
e AVL e
r
tryDelL (P AVL e
l e
e AVL e
r) = AVL e -> Maybe (AVL e)
forall a. a -> Maybe a
Just (AVL e -> Maybe (AVL e)) -> AVL e -> Maybe (AVL e)
forall a b. (a -> b) -> a -> b
$! AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
delLP AVL e
l e
e AVL e
r
delR :: AVL e -> AVL e
delR :: forall e. AVL e -> AVL e
delR AVL e
E = AVL e
forall e. AVL e
E
delR (N AVL e
l e
e AVL e
r) = AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
delRN AVL e
l e
e AVL e
r
delR (Z AVL e
l e
e AVL e
r) = AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
delRZ AVL e
l e
e AVL e
r
delR (P AVL e
l e
e AVL e
r) = AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
delRP AVL e
l e
e AVL e
r
assertDelR :: AVL e -> AVL e
assertDelR :: forall e. AVL e -> AVL e
assertDelR AVL e
E = [Char] -> AVL e
forall a. HasCallStack => [Char] -> a
error [Char]
"assertDelR: Empty tree."
assertDelR (N AVL e
l e
e AVL e
r) = AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
delRN AVL e
l e
e AVL e
r
assertDelR (Z AVL e
l e
e AVL e
r) = AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
delRZ AVL e
l e
e AVL e
r
assertDelR (P AVL e
l e
e AVL e
r) = AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
delRP AVL e
l e
e AVL e
r
tryDelR :: AVL e -> Maybe (AVL e)
tryDelR :: forall e. AVL e -> Maybe (AVL e)
tryDelR AVL e
E = Maybe (AVL e)
forall a. Maybe a
Nothing
tryDelR (N AVL e
l e
e AVL e
r) = AVL e -> Maybe (AVL e)
forall a. a -> Maybe a
Just (AVL e -> Maybe (AVL e)) -> AVL e -> Maybe (AVL e)
forall a b. (a -> b) -> a -> b
$! AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
delRN AVL e
l e
e AVL e
r
tryDelR (Z AVL e
l e
e AVL e
r) = AVL e -> Maybe (AVL e)
forall a. a -> Maybe a
Just (AVL e -> Maybe (AVL e)) -> AVL e -> Maybe (AVL e)
forall a b. (a -> b) -> a -> b
$! AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
delRZ AVL e
l e
e AVL e
r
tryDelR (P AVL e
l e
e AVL e
r) = AVL e -> Maybe (AVL e)
forall a. a -> Maybe a
Just (AVL e -> Maybe (AVL e)) -> AVL e -> Maybe (AVL e)
forall a b. (a -> b) -> a -> b
$! AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
delRP AVL e
l e
e AVL e
r
assertPopL :: AVL e -> (e,AVL e)
assertPopL :: forall e. AVL e -> (e, AVL e)
assertPopL AVL e
E = [Char] -> (e, AVL e)
forall a. HasCallStack => [Char] -> a
error [Char]
"assertPopL: Empty tree."
assertPopL (N AVL e
l e
e AVL e
r) = case AVL e -> e -> AVL e -> (# e, AVL e #)
forall e. AVL e -> e -> AVL e -> (# e, AVL e #)
popLN AVL e
l e
e AVL e
r of UBT2(AVL e
v,t) -> (e
v,AVL e
t)
assertPopL (Z AVL e
l e
e AVL e
r) = case AVL e -> e -> AVL e -> (# e, AVL e #)
forall e. AVL e -> e -> AVL e -> (# e, AVL e #)
popLZ AVL e
l e
e AVL e
r of UBT2(AVL e
v,t) -> (e
v,AVL e
t)
assertPopL (P AVL e
l e
e AVL e
r) = case AVL e -> e -> AVL e -> (# e, AVL e #)
forall e. AVL e -> e -> AVL e -> (# e, AVL e #)
popLP AVL e
l e
e AVL e
r of UBT2(AVL e
v,t) -> (e
v,AVL e
t)
tryPopL :: AVL e -> Maybe (e,AVL e)
tryPopL :: forall e. AVL e -> Maybe (e, AVL e)
tryPopL AVL e
E = Maybe (e, AVL e)
forall a. Maybe a
Nothing
tryPopL (N AVL e
l e
e AVL e
r) = (e, AVL e) -> Maybe (e, AVL e)
forall a. a -> Maybe a
Just ((e, AVL e) -> Maybe (e, AVL e)) -> (e, AVL e) -> Maybe (e, AVL 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
l e
e AVL e
r of UBT2(AVL e
v,t) -> (e
v,AVL e
t)
tryPopL (Z AVL e
l e
e AVL e
r) = (e, AVL e) -> Maybe (e, AVL e)
forall a. a -> Maybe a
Just ((e, AVL e) -> Maybe (e, AVL e)) -> (e, AVL e) -> Maybe (e, AVL 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
l e
e AVL e
r of UBT2(AVL e
v,t) -> (e
v,AVL e
t)
tryPopL (P AVL e
l e
e AVL e
r) = (e, AVL e) -> Maybe (e, AVL e)
forall a. a -> Maybe a
Just ((e, AVL e) -> Maybe (e, AVL e)) -> (e, AVL e) -> Maybe (e, AVL 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
l e
e AVL e
r of UBT2(AVL e
v,t) -> (e
v,AVL e
t)
assertPopR :: AVL e -> (AVL e,e)
assertPopR :: forall e. AVL e -> (AVL e, e)
assertPopR AVL e
E = [Char] -> (AVL e, e)
forall a. HasCallStack => [Char] -> a
error [Char]
"assertPopR: Empty tree."
assertPopR (N AVL e
l e
e AVL e
r) = case AVL e -> e -> AVL e -> (# AVL e, e #)
forall e. AVL e -> e -> AVL e -> (# AVL e, e #)
popRN AVL e
l e
e AVL e
r of UBT2(e
t,v) -> (AVL e
t,e
v)
assertPopR (Z AVL e
l e
e AVL e
r) = case AVL e -> e -> AVL e -> (# AVL e, e #)
forall e. AVL e -> e -> AVL e -> (# AVL e, e #)
popRZ AVL e
l e
e AVL e
r of UBT2(e
t,v) -> (AVL e
t,e
v)
assertPopR (P AVL e
l e
e AVL e
r) = case AVL e -> e -> AVL e -> (# AVL e, e #)
forall e. AVL e -> e -> AVL e -> (# AVL e, e #)
popRP AVL e
l e
e AVL e
r of UBT2(e
t,v) -> (AVL e
t,e
v)
tryPopR :: AVL e -> Maybe (AVL e,e)
tryPopR :: forall e. AVL e -> Maybe (AVL e, e)
tryPopR AVL e
E = Maybe (AVL e, e)
forall a. Maybe a
Nothing
tryPopR (N AVL e
l e
e AVL e
r) = (AVL e, e) -> Maybe (AVL e, e)
forall a. a -> Maybe a
Just ((AVL e, e) -> Maybe (AVL e, e)) -> (AVL e, e) -> Maybe (AVL e, 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
l e
e AVL e
r of UBT2(e
t,v) -> (AVL e
t,e
v)
tryPopR (Z AVL e
l e
e AVL e
r) = (AVL e, e) -> Maybe (AVL e, e)
forall a. a -> Maybe a
Just ((AVL e, e) -> Maybe (AVL e, e)) -> (AVL e, e) -> Maybe (AVL e, 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
l e
e AVL e
r of UBT2(e
t,v) -> (AVL e
t,e
v)
tryPopR (P AVL e
l e
e AVL e
r) = (AVL e, e) -> Maybe (AVL e, e)
forall a. a -> Maybe a
Just ((AVL e, e) -> Maybe (AVL e, e)) -> (AVL e, e) -> Maybe (AVL e, 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
l e
e AVL e
r of UBT2(e
t,v) -> (AVL e
t,e
v)
delete :: (e -> Ordering) -> AVL e -> AVL e
delete :: forall e. (e -> Ordering) -> AVL e -> AVL e
delete e -> Ordering
c AVL e
t = case (e -> Ordering) -> AVL e -> Int#
forall e. (e -> Ordering) -> AVL e -> Int#
findFullPath e -> Ordering
c AVL e
t of
L(-1) -> t
Int#
p -> Int# -> AVL e -> AVL e
forall e. Int# -> AVL e -> AVL e
deletePath Int#
p AVL e
t
deleteIf :: (e -> COrdering Bool) -> AVL e -> AVL e
deleteIf :: forall e. (e -> COrdering Bool) -> AVL e -> AVL e
deleteIf e -> COrdering Bool
c AVL e
t = case (e -> COrdering Bool) -> AVL e -> BinPath Bool
forall e a. (e -> COrdering a) -> AVL e -> BinPath a
openPathWith e -> COrdering Bool
c AVL e
t of
FullBP Int#
p Bool
True -> Int# -> AVL e -> AVL e
forall e. Int# -> AVL e -> AVL e
deletePath Int#
p AVL e
t
BinPath Bool
_ -> AVL e
t
deleteMaybe :: (e -> COrdering (Maybe e)) -> AVL e -> AVL e
deleteMaybe :: forall e. (e -> COrdering (Maybe e)) -> AVL e -> AVL e
deleteMaybe e -> COrdering (Maybe e)
c AVL e
t = case (e -> COrdering (Maybe e)) -> AVL e -> BinPath (Maybe e)
forall e a. (e -> COrdering a) -> AVL e -> BinPath a
openPathWith e -> COrdering (Maybe e)
c AVL e
t of
FullBP Int#
p Maybe e
Nothing -> Int# -> AVL e -> AVL e
forall e. Int# -> AVL e -> AVL e
deletePath Int#
p AVL e
t
FullBP Int#
p (Just e
e) -> Int# -> e -> AVL e -> AVL e
forall e. Int# -> e -> AVL e -> AVL e
writePath Int#
p e
e AVL e
t
BinPath (Maybe e)
_ -> AVL e
t
deleteFast :: (e -> Ordering) -> AVL e -> AVL e
deleteFast :: forall e. (e -> Ordering) -> AVL e -> AVL e
deleteFast e -> Ordering
c = AVL e -> AVL e
delete' where
delete' :: AVL e -> AVL e
delete' AVL e
E = AVL e
forall e. AVL e
E
delete' (N AVL e
l e
e AVL e
r) = AVL e -> e -> AVL e -> AVL e
delN AVL e
l e
e AVL e
r
delete' (Z AVL e
l e
e AVL e
r) = AVL e -> e -> AVL e -> AVL e
delZ AVL e
l e
e AVL e
r
delete' (P AVL e
l e
e AVL e
r) = AVL e -> e -> AVL e -> AVL e
delP AVL e
l e
e AVL e
r
delN :: AVL e -> e -> AVL e -> AVL e
delN AVL e
l e
e AVL e
r = case e -> Ordering
c e
e of
Ordering
LT -> AVL e -> e -> AVL e -> AVL e
delNL AVL e
l e
e AVL e
r
Ordering
EQ -> AVL e -> AVL e -> AVL e
forall e. AVL e -> AVL e -> AVL e
subN AVL e
l AVL e
r
Ordering
GT -> AVL e -> e -> AVL e -> AVL e
delNR AVL e
l e
e AVL e
r
delZ :: AVL e -> e -> AVL e -> AVL e
delZ AVL e
l e
e AVL e
r = case e -> Ordering
c e
e of
Ordering
LT -> AVL e -> e -> AVL e -> AVL e
delZL AVL e
l e
e AVL e
r
Ordering
EQ -> AVL e -> AVL e -> AVL e
forall e. AVL e -> AVL e -> AVL e
subZR AVL e
l AVL e
r
Ordering
GT -> AVL e -> e -> AVL e -> AVL e
delZR AVL e
l e
e AVL e
r
delP :: AVL e -> e -> AVL e -> AVL e
delP AVL e
l e
e AVL e
r = case e -> Ordering
c e
e of
Ordering
LT -> AVL e -> e -> AVL e -> AVL e
delPL AVL e
l e
e AVL e
r
Ordering
EQ -> AVL e -> AVL e -> AVL e
forall e. AVL e -> AVL e -> AVL e
subP AVL e
l AVL e
r
Ordering
GT -> AVL e -> e -> AVL e -> AVL e
delPR AVL e
l e
e AVL e
r
delNL :: AVL e -> e -> AVL e -> AVL e
delNL AVL e
E e
e AVL e
r = AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
N AVL e
forall e. AVL e
E e
e AVL e
r
delNL (N AVL e
ll e
le AVL e
lr) e
e AVL e
r = case e -> Ordering
c e
le of
Ordering
LT -> AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
chkLN (AVL e -> e -> AVL e -> AVL e
delNL AVL e
ll e
le AVL e
lr) e
e AVL e
r
Ordering
EQ -> AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
chkLN (AVL e -> AVL e -> AVL e
forall e. AVL e -> AVL e -> AVL e
subN AVL e
ll AVL e
lr) e
e AVL e
r
Ordering
GT -> AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
chkLN (AVL e -> e -> AVL e -> AVL e
delNR AVL e
ll e
le AVL e
lr) e
e AVL e
r
delNL (Z AVL e
ll e
le AVL e
lr) e
e AVL e
r = case e -> Ordering
c e
le of
Ordering
LT -> let l' :: AVL e
l' = AVL e -> e -> AVL e -> AVL e
delZL 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
Ordering
EQ -> AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
chkLN' (AVL e -> AVL e -> AVL e
forall e. AVL e -> AVL e -> AVL e
subZR AVL e
ll AVL e
lr) e
e AVL e
r
Ordering
GT -> let l' :: AVL e
l' = AVL e -> e -> AVL e -> AVL e
delZR 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
delNL (P AVL e
ll e
le AVL e
lr) e
e AVL e
r = case e -> Ordering
c e
le of
Ordering
LT -> AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
chkLN (AVL e -> e -> AVL e -> AVL e
delPL AVL e
ll e
le AVL e
lr) e
e AVL e
r
Ordering
EQ -> AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
chkLN (AVL e -> AVL e -> AVL e
forall e. AVL e -> AVL e -> AVL e
subP AVL e
ll AVL e
lr) e
e AVL e
r
Ordering
GT -> AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
chkLN (AVL e -> e -> AVL e -> AVL e
delPR AVL e
ll e
le AVL e
lr) e
e AVL e
r
delNR :: AVL e -> e -> AVL e -> AVL e
delNR AVL e
_ e
_ AVL e
E = [Char] -> AVL e
forall a. HasCallStack => [Char] -> a
error [Char]
"delNR: Bug0"
delNR AVL e
l e
e (N AVL e
rl e
re AVL e
rr) = case e -> Ordering
c e
re of
Ordering
LT -> AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
chkRN AVL e
l e
e (AVL e -> e -> AVL e -> AVL e
delNL AVL e
rl e
re AVL e
rr)
Ordering
EQ -> AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
chkRN AVL e
l e
e (AVL e -> AVL e -> AVL e
forall e. AVL e -> AVL e -> AVL e
subN AVL e
rl AVL e
rr)
Ordering
GT -> AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
chkRN AVL e
l e
e (AVL e -> e -> AVL e -> AVL e
delNR AVL e
rl e
re AVL e
rr)
delNR AVL e
l e
e (Z AVL e
rl e
re AVL e
rr) = case e -> Ordering
c e
re of
Ordering
LT -> let r' :: AVL e
r' = AVL e -> e -> AVL e -> AVL e
delZL 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'
Ordering
EQ -> AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
chkRN' AVL e
l e
e (AVL e -> AVL e -> AVL e
forall e. AVL e -> AVL e -> AVL e
subZL AVL e
rl AVL e
rr)
Ordering
GT -> let r' :: AVL e
r' = AVL e -> e -> AVL e -> AVL e
delZR 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'
delNR AVL e
l e
e (P AVL e
rl e
re AVL e
rr) = case e -> Ordering
c e
re of
Ordering
LT -> AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
chkRN AVL e
l e
e (AVL e -> e -> AVL e -> AVL e
delPL AVL e
rl e
re AVL e
rr)
Ordering
EQ -> AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
chkRN AVL e
l e
e (AVL e -> AVL e -> AVL e
forall e. AVL e -> AVL e -> AVL e
subP AVL e
rl AVL e
rr)
Ordering
GT -> AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
chkRN AVL e
l e
e (AVL e -> e -> AVL e -> AVL e
delPR AVL e
rl e
re AVL e
rr)
delZL :: AVL e -> e -> AVL e -> AVL e
delZL 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
forall e. AVL e
E e
e AVL e
r
delZL (N AVL e
ll e
le AVL e
lr) e
e AVL e
r = case e -> Ordering
c e
le of
Ordering
LT -> AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
chkLZ (AVL e -> e -> AVL e -> AVL e
delNL AVL e
ll e
le AVL e
lr) e
e AVL e
r
Ordering
EQ -> AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
chkLZ (AVL e -> AVL e -> AVL e
forall e. AVL e -> AVL e -> AVL e
subN AVL e
ll AVL e
lr) e
e AVL e
r
Ordering
GT -> AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
chkLZ (AVL e -> e -> AVL e -> AVL e
delNR AVL e
ll e
le AVL e
lr) e
e AVL e
r
delZL (Z AVL e
ll e
le AVL e
lr) e
e AVL e
r = case e -> Ordering
c e
le of
Ordering
LT -> let l' :: AVL e
l' = AVL e -> e -> AVL e -> AVL e
delZL 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
Ordering
EQ -> AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
chkLZ' (AVL e -> AVL e -> AVL e
forall e. AVL e -> AVL e -> AVL e
subZR AVL e
ll AVL e
lr) e
e AVL e
r
Ordering
GT -> let l' :: AVL e
l' = AVL e -> e -> AVL e -> AVL e
delZR 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
delZL (P AVL e
ll e
le AVL e
lr) e
e AVL e
r = case e -> Ordering
c e
le of
Ordering
LT -> AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
chkLZ (AVL e -> e -> AVL e -> AVL e
delPL AVL e
ll e
le AVL e
lr) e
e AVL e
r
Ordering
EQ -> AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
chkLZ (AVL e -> AVL e -> AVL e
forall e. AVL e -> AVL e -> AVL e
subP AVL e
ll AVL e
lr) e
e AVL e
r
Ordering
GT -> AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
chkLZ (AVL e -> e -> AVL e -> AVL e
delPR AVL e
ll e
le AVL e
lr) e
e AVL e
r
delZR :: AVL e -> e -> AVL e -> AVL e
delZR 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
forall e. AVL e
E
delZR AVL e
l e
e (N AVL e
rl e
re AVL e
rr) = case e -> Ordering
c e
re of
Ordering
LT -> AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
chkRZ AVL e
l e
e (AVL e -> e -> AVL e -> AVL e
delNL AVL e
rl e
re AVL e
rr)
Ordering
EQ -> AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
chkRZ AVL e
l e
e (AVL e -> AVL e -> AVL e
forall e. AVL e -> AVL e -> AVL e
subN AVL e
rl AVL e
rr)
Ordering
GT -> AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
chkRZ AVL e
l e
e (AVL e -> e -> AVL e -> AVL e
delNR AVL e
rl e
re AVL e
rr)
delZR AVL e
l e
e (Z AVL e
rl e
re AVL e
rr) = case e -> Ordering
c e
re of
Ordering
LT -> let r' :: AVL e
r' = AVL e -> e -> AVL e -> AVL e
delZL 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'
Ordering
EQ -> AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
chkRZ' AVL e
l e
e (AVL e -> AVL e -> AVL e
forall e. AVL e -> AVL e -> AVL e
subZL AVL e
rl AVL e
rr)
Ordering
GT -> let r' :: AVL e
r' = AVL e -> e -> AVL e -> AVL e
delZR 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'
delZR AVL e
l e
e (P AVL e
rl e
re AVL e
rr) = case e -> Ordering
c e
re of
Ordering
LT -> AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
chkRZ AVL e
l e
e (AVL e -> e -> AVL e -> AVL e
delPL AVL e
rl e
re AVL e
rr)
Ordering
EQ -> AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
chkRZ AVL e
l e
e (AVL e -> AVL e -> AVL e
forall e. AVL e -> AVL e -> AVL e
subP AVL e
rl AVL e
rr)
Ordering
GT -> AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
chkRZ AVL e
l e
e (AVL e -> e -> AVL e -> AVL e
delPR AVL e
rl e
re AVL e
rr)
delPL :: AVL e -> e -> AVL e -> AVL e
delPL AVL e
E e
_ AVL e
_ = [Char] -> AVL e
forall a. HasCallStack => [Char] -> a
error [Char]
"delPL: Bug0"
delPL (N AVL e
ll e
le AVL e
lr) e
e AVL e
r = case e -> Ordering
c e
le of
Ordering
LT -> AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
chkLP (AVL e -> e -> AVL e -> AVL e
delNL AVL e
ll e
le AVL e
lr) e
e AVL e
r
Ordering
EQ -> AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
chkLP (AVL e -> AVL e -> AVL e
forall e. AVL e -> AVL e -> AVL e
subN AVL e
ll AVL e
lr) e
e AVL e
r
Ordering
GT -> AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
chkLP (AVL e -> e -> AVL e -> AVL e
delNR AVL e
ll e
le AVL e
lr) e
e AVL e
r
delPL (Z AVL e
ll e
le AVL e
lr) e
e AVL e
r = case e -> Ordering
c e
le of
Ordering
LT -> let l' :: AVL e
l' = AVL e -> e -> AVL e -> AVL e
delZL 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
Ordering
EQ -> AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
chkLP' (AVL e -> AVL e -> AVL e
forall e. AVL e -> AVL e -> AVL e
subZR AVL e
ll AVL e
lr) e
e AVL e
r
Ordering
GT -> let l' :: AVL e
l' = AVL e -> e -> AVL e -> AVL e
delZR 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
delPL (P AVL e
ll e
le AVL e
lr) e
e AVL e
r = case e -> Ordering
c e
le of
Ordering
LT -> AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
chkLP (AVL e -> e -> AVL e -> AVL e
delPL AVL e
ll e
le AVL e
lr) e
e AVL e
r
Ordering
EQ -> AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
chkLP (AVL e -> AVL e -> AVL e
forall e. AVL e -> AVL e -> AVL e
subP AVL e
ll AVL e
lr) e
e AVL e
r
Ordering
GT -> AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
chkLP (AVL e -> e -> AVL e -> AVL e
delPR AVL e
ll e
le AVL e
lr) e
e AVL e
r
delPR :: AVL e -> e -> AVL e -> AVL e
delPR AVL e
l e
e AVL e
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
forall e. AVL e
E
delPR AVL e
l e
e (N AVL e
rl e
re AVL e
rr) = case e -> Ordering
c e
re of
Ordering
LT -> AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
chkRP AVL e
l e
e (AVL e -> e -> AVL e -> AVL e
delNL AVL e
rl e
re AVL e
rr)
Ordering
EQ -> AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
chkRP AVL e
l e
e (AVL e -> AVL e -> AVL e
forall e. AVL e -> AVL e -> AVL e
subN AVL e
rl AVL e
rr)
Ordering
GT -> AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
chkRP AVL e
l e
e (AVL e -> e -> AVL e -> AVL e
delNR AVL e
rl e
re AVL e
rr)
delPR AVL e
l e
e (Z AVL e
rl e
re AVL e
rr) = case e -> Ordering
c e
re of
Ordering
LT -> let r' :: AVL e
r' = AVL e -> e -> AVL e -> AVL e
delZL 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'
Ordering
EQ -> AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
chkRP' AVL e
l e
e (AVL e -> AVL e -> AVL e
forall e. AVL e -> AVL e -> AVL e
subZL AVL e
rl AVL e
rr)
Ordering
GT -> let r' :: AVL e
r' = AVL e -> e -> AVL e -> AVL e
delZR 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'
delPR AVL e
l e
e (P AVL e
rl e
re AVL e
rr) = case e -> Ordering
c e
re of
Ordering
LT -> AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
chkRP AVL e
l e
e (AVL e -> e -> AVL e -> AVL e
delPL AVL e
rl e
re AVL e
rr)
Ordering
EQ -> AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
chkRP AVL e
l e
e (AVL e -> AVL e -> AVL e
forall e. AVL e -> AVL e -> AVL e
subP AVL e
rl AVL e
rr)
Ordering
GT -> AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
chkRP AVL e
l e
e (AVL e -> e -> AVL e -> AVL e
delPR AVL e
rl e
re AVL e
rr)
assertPop :: (e -> COrdering a) -> AVL e -> (a,AVL e)
assertPop :: forall e a. (e -> COrdering a) -> AVL e -> (a, AVL e)
assertPop e -> COrdering a
c = AVL e -> (a, AVL e)
genPop_ where
genPop_ :: AVL e -> (a, AVL e)
genPop_ AVL e
E = [Char] -> (a, AVL e)
forall a. HasCallStack => [Char] -> a
error [Char]
"assertPop: element not found."
genPop_ (N AVL e
l e
e AVL e
r) = case AVL e -> e -> AVL e -> (# a, AVL e #)
popN AVL e
l e
e AVL e
r of UBT2(AVL e
v,t) -> (a
v,AVL e
t)
genPop_ (Z AVL e
l e
e AVL e
r) = case AVL e -> e -> AVL e -> (# a, AVL e #)
popZ AVL e
l e
e AVL e
r of UBT2(AVL e
v,t) -> (a
v,AVL e
t)
genPop_ (P AVL e
l e
e AVL e
r) = case AVL e -> e -> AVL e -> (# a, AVL e #)
popP AVL e
l e
e AVL e
r of UBT2(AVL e
v,t) -> (a
v,AVL e
t)
popN :: AVL e -> e -> AVL e -> (# a, AVL e #)
popN AVL e
l e
e AVL e
r = case e -> COrdering a
c e
e of
COrdering a
Lt -> AVL e -> e -> AVL e -> (# a, AVL e #)
popNL AVL e
l e
e AVL e
r
Eq a
a -> let t :: AVL e
t = AVL e -> AVL e -> AVL e
forall e. AVL e -> AVL e -> AVL e
subN AVL e
l AVL e
r in AVL e
t AVL e -> (# a, AVL e #) -> (# a, AVL e #)
forall a b. a -> b -> b
`seq` UBT2(AVL e
a,t)
COrdering a
Gt -> AVL e -> e -> AVL e -> (# a, AVL e #)
popNR AVL e
l e
e AVL e
r
popZ :: AVL e -> e -> AVL e -> (# a, AVL e #)
popZ AVL e
l e
e AVL e
r = case e -> COrdering a
c e
e of
COrdering a
Lt -> AVL e -> e -> AVL e -> (# a, AVL e #)
popZL AVL e
l e
e AVL e
r
Eq a
a -> let t :: AVL e
t = AVL e -> AVL e -> AVL e
forall e. AVL e -> AVL e -> AVL e
subZR AVL e
l AVL e
r in AVL e
t AVL e -> (# a, AVL e #) -> (# a, AVL e #)
forall a b. a -> b -> b
`seq` UBT2(AVL e
a,t)
COrdering a
Gt -> AVL e -> e -> AVL e -> (# a, AVL e #)
popZR AVL e
l e
e AVL e
r
popP :: AVL e -> e -> AVL e -> (# a, AVL e #)
popP AVL e
l e
e AVL e
r = case e -> COrdering a
c e
e of
COrdering a
Lt -> AVL e -> e -> AVL e -> (# a, AVL e #)
popPL AVL e
l e
e AVL e
r
Eq a
a -> let t :: AVL e
t = AVL e -> AVL e -> AVL e
forall e. AVL e -> AVL e -> AVL e
subP AVL e
l AVL e
r in AVL e
t AVL e -> (# a, AVL e #) -> (# a, AVL e #)
forall a b. a -> b -> b
`seq` UBT2(AVL e
a,t)
COrdering a
Gt -> AVL e -> e -> AVL e -> (# a, AVL e #)
popPR AVL e
l e
e AVL e
r
popNL :: AVL e -> e -> AVL e -> (# a, AVL e #)
popNL AVL e
E e
_ AVL e
_ = [Char] -> (# a, AVL e #)
forall a. HasCallStack => [Char] -> a
error [Char]
"assertPop: element not found."
popNL (N AVL e
ll e
le AVL e
lr) e
e AVL e
r = case e -> COrdering a
c e
le of
COrdering a
Lt -> case AVL e -> e -> AVL e -> (# a, AVL e #)
popNL AVL e
ll e
le AVL e
lr of
UBT2(a,l_) -> let t :: AVL e
t = AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
chkLN AVL e
l_ e
e AVL e
r in AVL e
t AVL e -> (# a, AVL e #) -> (# a, AVL e #)
forall a b. a -> b -> b
`seq` UBT2(AVL e
a,t)
Eq a
a -> let t :: AVL e
t = AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
chkLN (AVL e -> AVL e -> AVL e
forall e. AVL e -> AVL e -> AVL e
subN AVL e
ll AVL e
lr) e
e AVL e
r in AVL e
t AVL e -> (# a, AVL e #) -> (# a, AVL e #)
forall a b. a -> b -> b
`seq` UBT2(AVL e
a,t)
COrdering a
Gt -> case AVL e -> e -> AVL e -> (# a, AVL e #)
popNR AVL e
ll e
le AVL e
lr of
UBT2(a,l_) -> let t :: AVL e
t = AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
chkLN AVL e
l_ e
e AVL e
r in AVL e
t AVL e -> (# a, AVL e #) -> (# a, AVL e #)
forall a b. a -> b -> b
`seq` UBT2(AVL e
a,t)
popNL (Z AVL e
ll e
le AVL e
lr) e
e AVL e
r = case e -> COrdering a
c e
le of
COrdering a
Lt -> case AVL e -> e -> AVL e -> (# a, AVL e #)
popZL AVL e
ll e
le AVL e
lr of UBT2(a,l_) -> UBT2(aAVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
, N l_ AVL e
e r)
Eq a
a -> let t :: AVL e
t = AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
chkLN' (AVL e -> AVL e -> AVL e
forall e. AVL e -> AVL e -> AVL e
subZR AVL e
ll AVL e
lr) e
e AVL e
r
in AVL e
t AVL e -> (# a, AVL e #) -> (# a, AVL e #)
forall a b. a -> b -> b
`seq` UBT2(AVL e
a,t)
COrdering a
Gt -> case AVL e -> e -> AVL e -> (# a, AVL e #)
popZR AVL e
ll e
le AVL e
lr of UBT2(a,l_) -> UBT2(aAVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
, N l_ AVL e
e r)
popNL (P AVL e
ll e
le AVL e
lr) e
e AVL e
r = case e -> COrdering a
c e
le of
COrdering a
Lt -> case AVL e -> e -> AVL e -> (# a, AVL e #)
popPL AVL e
ll e
le AVL e
lr of
UBT2(a,l_) -> let t :: AVL e
t = AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
chkLN AVL e
l_ e
e AVL e
r in AVL e
t AVL e -> (# a, AVL e #) -> (# a, AVL e #)
forall a b. a -> b -> b
`seq` UBT2(AVL e
a,t)
Eq a
a -> let t :: AVL e
t = AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
chkLN (AVL e -> AVL e -> AVL e
forall e. AVL e -> AVL e -> AVL e
subP AVL e
ll AVL e
lr) e
e AVL e
r in AVL e
t AVL e -> (# a, AVL e #) -> (# a, AVL e #)
forall a b. a -> b -> b
`seq` UBT2(AVL e
a,t)
COrdering a
Gt -> case AVL e -> e -> AVL e -> (# a, AVL e #)
popPR AVL e
ll e
le AVL e
lr of
UBT2(a,l_) -> let t :: AVL e
t = AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
chkLN AVL e
l_ e
e AVL e
r in AVL e
t AVL e -> (# a, AVL e #) -> (# a, AVL e #)
forall a b. a -> b -> b
`seq` UBT2(AVL e
a,t)
popNR :: AVL e -> e -> AVL e -> (# a, AVL e #)
popNR AVL e
_ e
_ AVL e
E = [Char] -> (# a, AVL e #)
forall a. HasCallStack => [Char] -> a
error [Char]
"genPop.popNR: Bug!"
popNR AVL e
l e
e (N AVL e
rl e
re AVL e
rr) = case e -> COrdering a
c e
re of
COrdering a
Lt -> case AVL e -> e -> AVL e -> (# a, AVL e #)
popNL AVL e
rl e
re AVL e
rr of
UBT2(a,r_) -> let t :: AVL e
t = AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
chkRN AVL e
l e
e AVL e
r_ in AVL e
t AVL e -> (# a, AVL e #) -> (# a, AVL e #)
forall a b. a -> b -> b
`seq` UBT2(AVL e
a,t)
Eq a
a -> let t :: AVL e
t = AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
chkRN AVL e
l e
e (AVL e -> AVL e -> AVL e
forall e. AVL e -> AVL e -> AVL e
subN AVL e
rl AVL e
rr) in AVL e
t AVL e -> (# a, AVL e #) -> (# a, AVL e #)
forall a b. a -> b -> b
`seq` UBT2(AVL e
a,t)
COrdering a
Gt -> case AVL e -> e -> AVL e -> (# a, AVL e #)
popNR AVL e
rl e
re AVL e
rr of
UBT2(a,r_) -> let t :: AVL e
t = AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
chkRN AVL e
l e
e AVL e
r_ in AVL e
t AVL e -> (# a, AVL e #) -> (# a, AVL e #)
forall a b. a -> b -> b
`seq` UBT2(AVL e
a,t)
popNR AVL e
l e
e (Z AVL e
rl e
re AVL e
rr) = case e -> COrdering a
c e
re of
COrdering a
Lt -> case AVL e -> e -> AVL e -> (# a, AVL e #)
popZL AVL e
rl e
re AVL e
rr of UBT2(a,r_) -> UBT2(aAVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
, AVL e
N e
l e r_)
Eq a
a -> let t :: AVL e
t = AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
chkRN' AVL e
l e
e (AVL e -> AVL e -> AVL e
forall e. AVL e -> AVL e -> AVL e
subZL AVL e
rl AVL e
rr)
in AVL e
t AVL e -> (# a, AVL e #) -> (# a, AVL e #)
forall a b. a -> b -> b
`seq` UBT2(AVL e
a,t)
COrdering a
Gt -> case AVL e -> e -> AVL e -> (# a, AVL e #)
popZR AVL e
rl e
re AVL e
rr of UBT2(a,r_) -> UBT2(aAVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
, AVL e
N e
l e r_)
popNR AVL e
l e
e (P AVL e
rl e
re AVL e
rr) = case e -> COrdering a
c e
re of
COrdering a
Lt -> case AVL e -> e -> AVL e -> (# a, AVL e #)
popPL AVL e
rl e
re AVL e
rr of
UBT2(a,r_) -> let t :: AVL e
t = AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
chkRN AVL e
l e
e AVL e
r_ in AVL e
t AVL e -> (# a, AVL e #) -> (# a, AVL e #)
forall a b. a -> b -> b
`seq` UBT2(AVL e
a,t)
Eq a
a -> let t :: AVL e
t = AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
chkRN AVL e
l e
e (AVL e -> AVL e -> AVL e
forall e. AVL e -> AVL e -> AVL e
subP AVL e
rl AVL e
rr) in AVL e
t AVL e -> (# a, AVL e #) -> (# a, AVL e #)
forall a b. a -> b -> b
`seq` UBT2(AVL e
a,t)
COrdering a
Gt -> case AVL e -> e -> AVL e -> (# a, AVL e #)
popPR AVL e
rl e
re AVL e
rr of
UBT2(a,r_) -> let t :: AVL e
t = AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
chkRN AVL e
l e
e AVL e
r_ in AVL e
t AVL e -> (# a, AVL e #) -> (# a, AVL e #)
forall a b. a -> b -> b
`seq` UBT2(AVL e
a,t)
popZL :: AVL e -> e -> AVL e -> (# a, AVL e #)
popZL AVL e
E e
_ AVL e
_ = [Char] -> (# a, AVL e #)
forall a. HasCallStack => [Char] -> a
error [Char]
"assertPop: element not found."
popZL (N AVL e
ll e
le AVL e
lr) e
e AVL e
r = case e -> COrdering a
c e
le of
COrdering a
Lt -> case AVL e -> e -> AVL e -> (# a, AVL e #)
popNL AVL e
ll e
le AVL e
lr of
UBT2(a,l_) -> let t :: AVL e
t = AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
chkLZ AVL e
l_ e
e AVL e
r in AVL e
t AVL e -> (# a, AVL e #) -> (# a, AVL e #)
forall a b. a -> b -> b
`seq` UBT2(AVL e
a,t)
Eq a
a -> let t :: AVL e
t = AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
chkLZ (AVL e -> AVL e -> AVL e
forall e. AVL e -> AVL e -> AVL e
subN AVL e
ll AVL e
lr) e
e AVL e
r in AVL e
t AVL e -> (# a, AVL e #) -> (# a, AVL e #)
forall a b. a -> b -> b
`seq` UBT2(AVL e
a,t)
COrdering a
Gt -> case AVL e -> e -> AVL e -> (# a, AVL e #)
popNR AVL e
ll e
le AVL e
lr of
UBT2(a,l_) -> let t :: AVL e
t = AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
chkLZ AVL e
l_ e
e AVL e
r in AVL e
t AVL e -> (# a, AVL e #) -> (# a, AVL e #)
forall a b. a -> b -> b
`seq` UBT2(AVL e
a,t)
popZL (Z AVL e
ll e
le AVL e
lr) e
e AVL e
r = case e -> COrdering a
c e
le of
COrdering a
Lt -> case AVL e -> e -> AVL e -> (# a, AVL e #)
popZL AVL e
ll e
le AVL e
lr of UBT2(a,l_) -> UBT2(aAVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
, Z l_ AVL e
e r)
Eq a
a -> let t :: AVL e
t = AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
chkLZ' (AVL e -> AVL e -> AVL e
forall e. AVL e -> AVL e -> AVL e
subZR AVL e
ll AVL e
lr) e
e AVL e
r
in AVL e
t AVL e -> (# a, AVL e #) -> (# a, AVL e #)
forall a b. a -> b -> b
`seq` UBT2(AVL e
a,t)
COrdering a
Gt -> case AVL e -> e -> AVL e -> (# a, AVL e #)
popZR AVL e
ll e
le AVL e
lr of UBT2(a,l_) -> UBT2(aAVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
, Z l_ AVL e
e r)
popZL (P AVL e
ll e
le AVL e
lr) e
e AVL e
r = case e -> COrdering a
c e
le of
COrdering a
Lt -> case AVL e -> e -> AVL e -> (# a, AVL e #)
popPL AVL e
ll e
le AVL e
lr of
UBT2(a,l_) -> let t :: AVL e
t = AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
chkLZ AVL e
l_ e
e AVL e
r in AVL e
t AVL e -> (# a, AVL e #) -> (# a, AVL e #)
forall a b. a -> b -> b
`seq` UBT2(AVL e
a,t)
Eq a
a -> let t :: AVL e
t = AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
chkLZ (AVL e -> AVL e -> AVL e
forall e. AVL e -> AVL e -> AVL e
subP AVL e
ll AVL e
lr) e
e AVL e
r in AVL e
t AVL e -> (# a, AVL e #) -> (# a, AVL e #)
forall a b. a -> b -> b
`seq` UBT2(AVL e
a,t)
COrdering a
Gt -> case AVL e -> e -> AVL e -> (# a, AVL e #)
popPR AVL e
ll e
le AVL e
lr of
UBT2(a,l_) -> let t :: AVL e
t = AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
chkLZ AVL e
l_ e
e AVL e
r in AVL e
t AVL e -> (# a, AVL e #) -> (# a, AVL e #)
forall a b. a -> b -> b
`seq` UBT2(AVL e
a,t)
popZR :: AVL e -> e -> AVL e -> (# a, AVL e #)
popZR AVL e
_ e
_ AVL e
E = [Char] -> (# a, AVL e #)
forall a. HasCallStack => [Char] -> a
error [Char]
"assertPop: element not found."
popZR AVL e
l e
e (N AVL e
rl e
re AVL e
rr) = case e -> COrdering a
c e
re of
COrdering a
Lt -> case AVL e -> e -> AVL e -> (# a, AVL e #)
popNL AVL e
rl e
re AVL e
rr of
UBT2(a,r_) -> let t :: AVL e
t = AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
chkRZ AVL e
l e
e AVL e
r_ in AVL e
t AVL e -> (# a, AVL e #) -> (# a, AVL e #)
forall a b. a -> b -> b
`seq` UBT2(AVL e
a,t)
Eq a
a -> let t :: AVL e
t = AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
chkRZ AVL e
l e
e (AVL e -> AVL e -> AVL e
forall e. AVL e -> AVL e -> AVL e
subN AVL e
rl AVL e
rr) in AVL e
t AVL e -> (# a, AVL e #) -> (# a, AVL e #)
forall a b. a -> b -> b
`seq` UBT2(AVL e
a,t)
COrdering a
Gt -> case AVL e -> e -> AVL e -> (# a, AVL e #)
popNR AVL e
rl e
re AVL e
rr of
UBT2(a,r_) -> let t :: AVL e
t = AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
chkRZ AVL e
l e
e AVL e
r_ in AVL e
t AVL e -> (# a, AVL e #) -> (# a, AVL e #)
forall a b. a -> b -> b
`seq` UBT2(AVL e
a,t)
popZR AVL e
l e
e (Z AVL e
rl e
re AVL e
rr) = case e -> COrdering a
c e
re of
COrdering a
Lt -> case AVL e -> e -> AVL e -> (# a, AVL e #)
popZL AVL e
rl e
re AVL e
rr of UBT2(a,r_) -> UBT2(aAVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
, AVL e
Z e
l e r_)
Eq a
a -> let t :: AVL e
t = AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
chkRZ' AVL e
l e
e (AVL e -> AVL e -> AVL e
forall e. AVL e -> AVL e -> AVL e
subZL AVL e
rl AVL e
rr)
in AVL e
t AVL e -> (# a, AVL e #) -> (# a, AVL e #)
forall a b. a -> b -> b
`seq` UBT2(AVL e
a,t)
COrdering a
Gt -> case AVL e -> e -> AVL e -> (# a, AVL e #)
popZR AVL e
rl e
re AVL e
rr of UBT2(a,r_) -> UBT2(aAVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
, AVL e
Z e
l e r_)
popZR AVL e
l e
e (P AVL e
rl e
re AVL e
rr) = case e -> COrdering a
c e
re of
COrdering a
Lt -> case AVL e -> e -> AVL e -> (# a, AVL e #)
popPL AVL e
rl e
re AVL e
rr of
UBT2(a,r_) -> let t :: AVL e
t = AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
chkRZ AVL e
l e
e AVL e
r_ in AVL e
t AVL e -> (# a, AVL e #) -> (# a, AVL e #)
forall a b. a -> b -> b
`seq` UBT2(AVL e
a,t)
Eq a
a -> let t :: AVL e
t = AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
chkRZ AVL e
l e
e (AVL e -> AVL e -> AVL e
forall e. AVL e -> AVL e -> AVL e
subP AVL e
rl AVL e
rr) in AVL e
t AVL e -> (# a, AVL e #) -> (# a, AVL e #)
forall a b. a -> b -> b
`seq` UBT2(AVL e
a,t)
COrdering a
Gt -> case AVL e -> e -> AVL e -> (# a, AVL e #)
popPR AVL e
rl e
re AVL e
rr of
UBT2(a,r_) -> let t :: AVL e
t = AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
chkRZ AVL e
l e
e AVL e
r_ in AVL e
t AVL e -> (# a, AVL e #) -> (# a, AVL e #)
forall a b. a -> b -> b
`seq` UBT2(AVL e
a,t)
popPL :: AVL e -> e -> AVL e -> (# a, AVL e #)
popPL AVL e
E e
_ AVL e
_ = [Char] -> (# a, AVL e #)
forall a. HasCallStack => [Char] -> a
error [Char]
"genPop.popPL: Bug!"
popPL (N AVL e
ll e
le AVL e
lr) e
e AVL e
r = case e -> COrdering a
c e
le of
COrdering a
Lt -> case AVL e -> e -> AVL e -> (# a, AVL e #)
popNL AVL e
ll e
le AVL e
lr of
UBT2(a,l_) -> let t :: AVL e
t = AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
chkLP AVL e
l_ e
e AVL e
r in AVL e
t AVL e -> (# a, AVL e #) -> (# a, AVL e #)
forall a b. a -> b -> b
`seq` UBT2(AVL e
a,t)
Eq a
a -> let t :: AVL e
t = AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
chkLP (AVL e -> AVL e -> AVL e
forall e. AVL e -> AVL e -> AVL e
subN AVL e
ll AVL e
lr) e
e AVL e
r in AVL e
t AVL e -> (# a, AVL e #) -> (# a, AVL e #)
forall a b. a -> b -> b
`seq` UBT2(AVL e
a,t)
COrdering a
Gt -> case AVL e -> e -> AVL e -> (# a, AVL e #)
popNR AVL e
ll e
le AVL e
lr of
UBT2(a,l_) -> let t :: AVL e
t = AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
chkLP AVL e
l_ e
e AVL e
r in AVL e
t AVL e -> (# a, AVL e #) -> (# a, AVL e #)
forall a b. a -> b -> b
`seq` UBT2(AVL e
a,t)
popPL (Z AVL e
ll e
le AVL e
lr) e
e AVL e
r = case e -> COrdering a
c e
le of
COrdering a
Lt -> case AVL e -> e -> AVL e -> (# a, AVL e #)
popZL AVL e
ll e
le AVL e
lr of UBT2(a,l_) -> UBT2(aAVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
, P l_ AVL e
e r)
Eq a
a -> let t :: AVL e
t = AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
chkLP' (AVL e -> AVL e -> AVL e
forall e. AVL e -> AVL e -> AVL e
subZR AVL e
ll AVL e
lr) e
e AVL e
r
in AVL e
t AVL e -> (# a, AVL e #) -> (# a, AVL e #)
forall a b. a -> b -> b
`seq` UBT2(AVL e
a,t)
COrdering a
Gt -> case AVL e -> e -> AVL e -> (# a, AVL e #)
popZR AVL e
ll e
le AVL e
lr of UBT2(a,l_) -> UBT2(aAVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
, P l_ AVL e
e r)
popPL (P AVL e
ll e
le AVL e
lr) e
e AVL e
r = case e -> COrdering a
c e
le of
COrdering a
Lt -> case AVL e -> e -> AVL e -> (# a, AVL e #)
popPL AVL e
ll e
le AVL e
lr of
UBT2(a,l_) -> let t :: AVL e
t = AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
chkLP AVL e
l_ e
e AVL e
r in AVL e
t AVL e -> (# a, AVL e #) -> (# a, AVL e #)
forall a b. a -> b -> b
`seq` UBT2(AVL e
a,t)
Eq a
a -> let t :: AVL e
t = AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
chkLP (AVL e -> AVL e -> AVL e
forall e. AVL e -> AVL e -> AVL e
subP AVL e
ll AVL e
lr) e
e AVL e
r in AVL e
t AVL e -> (# a, AVL e #) -> (# a, AVL e #)
forall a b. a -> b -> b
`seq` UBT2(AVL e
a,t)
COrdering a
Gt -> case AVL e -> e -> AVL e -> (# a, AVL e #)
popPR AVL e
ll e
le AVL e
lr of
UBT2(a,l_) -> let t :: AVL e
t = AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
chkLP AVL e
l_ e
e AVL e
r in AVL e
t AVL e -> (# a, AVL e #) -> (# a, AVL e #)
forall a b. a -> b -> b
`seq` UBT2(AVL e
a,t)
popPR :: AVL e -> e -> AVL e -> (# a, AVL e #)
popPR AVL e
_ e
_ AVL e
E = [Char] -> (# a, AVL e #)
forall a. HasCallStack => [Char] -> a
error [Char]
"assertPop: element not found."
popPR AVL e
l e
e (N AVL e
rl e
re AVL e
rr) = case e -> COrdering a
c e
re of
COrdering a
Lt -> case AVL e -> e -> AVL e -> (# a, AVL e #)
popNL AVL e
rl e
re AVL e
rr of
UBT2(a,r_) -> let t :: AVL e
t = AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
chkRP AVL e
l e
e AVL e
r_ in AVL e
t AVL e -> (# a, AVL e #) -> (# a, AVL e #)
forall a b. a -> b -> b
`seq` UBT2(AVL e
a,t)
Eq a
a -> let t :: AVL e
t = AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
chkRP AVL e
l e
e (AVL e -> AVL e -> AVL e
forall e. AVL e -> AVL e -> AVL e
subN AVL e
rl AVL e
rr) in AVL e
t AVL e -> (# a, AVL e #) -> (# a, AVL e #)
forall a b. a -> b -> b
`seq` UBT2(AVL e
a,t)
COrdering a
Gt -> case AVL e -> e -> AVL e -> (# a, AVL e #)
popNR AVL e
rl e
re AVL e
rr of
UBT2(a,r_) -> let t :: AVL e
t = AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
chkRP AVL e
l e
e AVL e
r_ in AVL e
t AVL e -> (# a, AVL e #) -> (# a, AVL e #)
forall a b. a -> b -> b
`seq` UBT2(AVL e
a,t)
popPR AVL e
l e
e (Z AVL e
rl e
re AVL e
rr) = case e -> COrdering a
c e
re of
COrdering a
Lt -> case AVL e -> e -> AVL e -> (# a, AVL e #)
popZL AVL e
rl e
re AVL e
rr of UBT2(a,r_) -> UBT2(aAVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
, AVL e
P e
l e r_)
Eq a
a -> let t :: AVL e
t = AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
chkRP' AVL e
l e
e (AVL e -> AVL e -> AVL e
forall e. AVL e -> AVL e -> AVL e
subZL AVL e
rl AVL e
rr)
in AVL e
t AVL e -> (# a, AVL e #) -> (# a, AVL e #)
forall a b. a -> b -> b
`seq` UBT2(AVL e
a,t)
COrdering a
Gt -> case AVL e -> e -> AVL e -> (# a, AVL e #)
popZR AVL e
rl e
re AVL e
rr of UBT2(a,r_) -> UBT2(aAVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
, AVL e
P e
l e r_)
popPR AVL e
l e
e (P AVL e
rl e
re AVL e
rr) = case e -> COrdering a
c e
re of
COrdering a
Lt -> case AVL e -> e -> AVL e -> (# a, AVL e #)
popPL AVL e
rl e
re AVL e
rr of
UBT2(a,r_) -> let t :: AVL e
t = AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
chkRP AVL e
l e
e AVL e
r_ in AVL e
t AVL e -> (# a, AVL e #) -> (# a, AVL e #)
forall a b. a -> b -> b
`seq` UBT2(AVL e
a,t)
Eq a
a -> let t :: AVL e
t = AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
chkRP AVL e
l e
e (AVL e -> AVL e -> AVL e
forall e. AVL e -> AVL e -> AVL e
subP AVL e
rl AVL e
rr) in AVL e
t AVL e -> (# a, AVL e #) -> (# a, AVL e #)
forall a b. a -> b -> b
`seq` UBT2(AVL e
a,t)
COrdering a
Gt -> case AVL e -> e -> AVL e -> (# a, AVL e #)
popPR AVL e
rl e
re AVL e
rr of
UBT2(a,r_) -> let t :: AVL e
t = AVL e -> e -> AVL e -> AVL e
forall e. AVL e -> e -> AVL e -> AVL e
chkRP AVL e
l e
e AVL e
r_ in AVL e
t AVL e -> (# a, AVL e #) -> (# a, AVL e #)
forall a b. a -> b -> b
`seq` UBT2(AVL e
a,t)
tryPop :: (e -> COrdering a) -> AVL e -> Maybe (a,AVL e)
tryPop :: forall e a. (e -> COrdering a) -> AVL e -> Maybe (a, AVL e)
tryPop e -> COrdering a
c AVL e
t = case (e -> COrdering a) -> AVL e -> BinPath a
forall e a. (e -> COrdering a) -> AVL e -> BinPath a
openPathWith e -> COrdering a
c AVL e
t of
FullBP Int#
pth a
a -> let t' :: AVL e
t' = Int# -> AVL e -> AVL e
forall e. Int# -> AVL e -> AVL e
deletePath Int#
pth AVL e
t in AVL e
t' AVL e -> Maybe (a, AVL e) -> Maybe (a, AVL e)
forall a b. a -> b -> b
`seq` (a, AVL e) -> Maybe (a, AVL e)
forall a. a -> Maybe a
Just (a
a,AVL e
t')
BinPath a
_ -> Maybe (a, AVL e)
forall a. Maybe a
Nothing
assertPopMaybe :: (e -> COrdering (a,Maybe e)) -> AVL e -> (a,AVL e)
assertPopMaybe :: forall e a. (e -> COrdering (a, Maybe e)) -> AVL e -> (a, AVL e)
assertPopMaybe e -> COrdering (a, Maybe e)
c AVL e
t = case (e -> COrdering (a, Maybe e)) -> AVL e -> BinPath (a, Maybe e)
forall e a. (e -> COrdering a) -> AVL e -> BinPath a
openPathWith e -> COrdering (a, Maybe e)
c AVL e
t of
FullBP Int#
pth (a
a,Just e
e ) -> let t' :: AVL e
t' = Int# -> e -> AVL e -> AVL e
forall e. Int# -> e -> AVL e -> AVL e
writePath Int#
pth e
e AVL e
t in AVL e
t' AVL e -> (a, AVL e) -> (a, AVL e)
forall a b. a -> b -> b
`seq` (a
a,AVL e
t')
FullBP Int#
pth (a
a,Maybe e
Nothing) -> let t' :: AVL e
t' = Int# -> AVL e -> AVL e
forall e. Int# -> AVL e -> AVL e
deletePath Int#
pth AVL e
t in AVL e
t' AVL e -> (a, AVL e) -> (a, AVL e)
forall a b. a -> b -> b
`seq` (a
a,AVL e
t')
BinPath (a, Maybe e)
_ -> [Char] -> (a, AVL e)
forall a. HasCallStack => [Char] -> a
error [Char]
"assertPopMaybe: element not found."
tryPopMaybe :: (e -> COrdering (a,Maybe e)) -> AVL e -> Maybe (a,AVL e)
tryPopMaybe :: forall e a.
(e -> COrdering (a, Maybe e)) -> AVL e -> Maybe (a, AVL e)
tryPopMaybe e -> COrdering (a, Maybe e)
c AVL e
t = case (e -> COrdering (a, Maybe e)) -> AVL e -> BinPath (a, Maybe e)
forall e a. (e -> COrdering a) -> AVL e -> BinPath a
openPathWith e -> COrdering (a, Maybe e)
c AVL e
t of
FullBP Int#
pth (a
a,Just e
e ) -> let t' :: AVL e
t' = Int# -> e -> AVL e -> AVL e
forall e. Int# -> e -> AVL e -> AVL e
writePath Int#
pth e
e AVL e
t in AVL e
t' AVL e -> Maybe (a, AVL e) -> Maybe (a, AVL e)
forall a b. a -> b -> b
`seq` (a, AVL e) -> Maybe (a, AVL e)
forall a. a -> Maybe a
Just (a
a,AVL e
t')
FullBP Int#
pth (a
a,Maybe e
Nothing) -> let t' :: AVL e
t' = Int# -> AVL e -> AVL e
forall e. Int# -> AVL e -> AVL e
deletePath Int#
pth AVL e
t in AVL e
t' AVL e -> Maybe (a, AVL e) -> Maybe (a, AVL e)
forall a b. a -> b -> b
`seq` (a, AVL e) -> Maybe (a, AVL e)
forall a. a -> Maybe a
Just (a
a,AVL e
t')
BinPath (a, Maybe e)
_ -> Maybe (a, AVL e)
forall a. Maybe a
Nothing
assertPopIf :: (e -> COrdering (a,Bool)) -> AVL e -> (a,AVL e)
assertPopIf :: forall e a. (e -> COrdering (a, Bool)) -> AVL e -> (a, AVL e)
assertPopIf e -> COrdering (a, Bool)
c AVL e
t = case (e -> COrdering (a, Bool)) -> AVL e -> BinPath (a, Bool)
forall e a. (e -> COrdering a) -> AVL e -> BinPath a
openPathWith e -> COrdering (a, Bool)
c AVL e
t of
FullBP Int#
_ (a
a,Bool
False) -> (a
a,AVL e
t)
FullBP Int#
pth (a
a,Bool
True ) -> let t' :: AVL e
t' = Int# -> AVL e -> AVL e
forall e. Int# -> AVL e -> AVL e
deletePath Int#
pth AVL e
t in AVL e
t' AVL e -> (a, AVL e) -> (a, AVL e)
forall a b. a -> b -> b
`seq` (a
a,AVL e
t')
BinPath (a, Bool)
_ -> [Char] -> (a, AVL e)
forall a. HasCallStack => [Char] -> a
error [Char]
"assertPopIf: element not found."
tryPopIf :: (e -> COrdering (a,Bool)) -> AVL e -> Maybe (a,AVL e)
tryPopIf :: forall e a. (e -> COrdering (a, Bool)) -> AVL e -> Maybe (a, AVL e)
tryPopIf e -> COrdering (a, Bool)
c AVL e
t = case (e -> COrdering (a, Bool)) -> AVL e -> BinPath (a, Bool)
forall e a. (e -> COrdering a) -> AVL e -> BinPath a
openPathWith e -> COrdering (a, Bool)
c AVL e
t of
FullBP Int#
_ (a
a,Bool
False) -> (a, AVL e) -> Maybe (a, AVL e)
forall a. a -> Maybe a
Just (a
a,AVL e
t)
FullBP Int#
pth (a
a,Bool
True ) -> let t' :: AVL e
t' = Int# -> AVL e -> AVL e
forall e. Int# -> AVL e -> AVL e
deletePath Int#
pth AVL e
t in AVL e
t' AVL e -> Maybe (a, AVL e) -> Maybe (a, AVL e)
forall a b. a -> b -> b
`seq` (a, AVL e) -> Maybe (a, AVL e)
forall a. a -> Maybe a
Just (a
a,AVL e
t')
BinPath (a, Bool)
_ -> Maybe (a, AVL e)
forall a. Maybe a
Nothing