{-# OPTIONS_HADDOCK hide #-}
module Data.Tree.AVL.Split
(
splitAtL,splitAtR,takeL,takeR,dropL,dropR,
rotateL,rotateR,popRotateL,popRotateR,rotateByL,rotateByR,
spanL,spanR,takeWhileL,dropWhileL,takeWhileR,dropWhileR,
forkL,forkR,fork,
takeLE,dropGT,
takeLT,dropGE,
takeGT,dropLE,
takeGE,dropLT,
) where
import Prelude
import Data.COrdering(COrdering(..))
import Data.Tree.AVL.Internals.Types(AVL(..))
import Data.Tree.AVL.Push(pushL,pushR)
import Data.Tree.AVL.Internals.DelUtils(popRN,popRZ,popRP,popLN,popLZ,popLP)
import Data.Tree.AVL.Internals.HAVL(HAVL(HAVL),spliceHAVL,pushLHAVL,pushRHAVL)
import Data.Tree.AVL.Internals.HJoin(joinH')
import GHC.Base
#include "ghcdefs.h"
data SplitResult e = All (HAVL e) (HAVL e)
| More {-# UNPACK #-} !UINT
splitAtL :: Int -> AVL e -> Either Int (AVL e, AVL e)
splitAtL :: forall e. Int -> AVL e -> Either Int (AVL e, AVL e)
splitAtL Int
n AVL e
_ | Int
n Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
0 = [Char] -> Either Int (AVL e, AVL e)
forall a. HasCallStack => [Char] -> a
error [Char]
"splitAtL: Negative argument."
splitAtL Int
0 AVL e
E = Int -> Either Int (AVL e, AVL e)
forall a b. a -> Either a b
Left Int
0
splitAtL Int
0 AVL e
t = (AVL e, AVL e) -> Either Int (AVL e, AVL e)
forall a b. b -> Either a b
Right (AVL e
forall e. AVL e
E,AVL e
t)
splitAtL ASINT(n) AVL e
t = case Int# -> AVL e -> Int# -> SplitResult e
forall e. Int# -> AVL e -> Int# -> SplitResult e
splitL Int#
n AVL e
t L(0) of
More Int#
n_ -> Int -> Either Int (AVL e, AVL e)
forall a b. a -> Either a b
Left ASINT(SUBINT(n,n_))
All (HAVL AVL e
l Int#
_) (HAVL AVL e
r Int#
_) -> (AVL e, AVL e) -> Either Int (AVL e, AVL e)
forall a b. b -> Either a b
Right (AVL e
l,AVL e
r)
splitL :: UINT -> AVL e -> UINT -> SplitResult e
splitL :: forall e. Int# -> AVL e -> Int# -> SplitResult e
splitL Int#
n AVL e
E Int#
_ = Int# -> SplitResult e
forall e. Int# -> SplitResult e
More Int#
n
splitL Int#
n (N AVL e
l e
e AVL e
r) Int#
h = Int# -> AVL e -> Int# -> e -> AVL e -> Int# -> SplitResult e
forall e.
Int# -> AVL e -> Int# -> e -> AVL e -> Int# -> SplitResult e
splitL_ Int#
n AVL e
l DECINT2(h) e r DECINT1(h)
splitL Int#
n (Z AVL e
l e
e AVL e
r) Int#
h = Int# -> AVL e -> Int# -> e -> AVL e -> Int# -> SplitResult e
forall e.
Int# -> AVL e -> Int# -> e -> AVL e -> Int# -> SplitResult e
splitL_ Int#
n AVL e
l DECINT1(h) e r DECINT1(h)
splitL Int#
n (P AVL e
l e
e AVL e
r) Int#
h = Int# -> AVL e -> Int# -> e -> AVL e -> Int# -> SplitResult e
forall e.
Int# -> AVL e -> Int# -> e -> AVL e -> Int# -> SplitResult e
splitL_ Int#
n AVL e
l DECINT1(h) e r DECINT2(h)
splitL_ :: UINT -> AVL e -> UINT -> e -> AVL e -> UINT -> SplitResult e
splitL_ :: forall e.
Int# -> AVL e -> Int# -> e -> AVL e -> Int# -> SplitResult e
splitL_ Int#
n AVL e
l Int#
hl e
e AVL e
r Int#
hr =
case Int# -> AVL e -> Int# -> SplitResult e
forall e. Int# -> AVL e -> Int# -> SplitResult e
splitL Int#
n AVL e
l Int#
hl of
More L(0) -> let rhavl = pushLHAVL e (HAVL r hr); lhavl = HAVL l hl
in lhavl `seq` rhavl `seq` All lhavl rhavl
More L(1) -> case r of
E -> More L(0)
_ -> let lhavl = pushRHAVL (HAVL l hl) e
rhavl = HAVL r hr
in lhavl `seq` rhavl `seq` All lhavl rhavl
More Int#
n_ -> let sr :: SplitResult e
sr = Int# -> AVL e -> Int# -> SplitResult e
forall e. Int# -> AVL e -> Int# -> SplitResult e
splitL DECINT1(n_) r hr
in case SplitResult e
sr of
More Int#
_ -> SplitResult e
sr
All HAVL e
havl0 HAVL e
havl1 -> let havl0' :: HAVL e
havl0' = HAVL e -> e -> HAVL e -> HAVL e
forall e. HAVL e -> e -> HAVL e -> HAVL e
spliceHAVL (AVL e -> Int# -> HAVL e
forall e. AVL e -> Int# -> HAVL e
HAVL AVL e
l Int#
hl) e
e HAVL e
havl0
in HAVL e
havl0' HAVL e -> SplitResult e -> SplitResult e
forall a b. a -> b -> b
`seq` HAVL e -> HAVL e -> SplitResult e
forall e. HAVL e -> HAVL e -> SplitResult e
All HAVL e
havl0' HAVL e
havl1
All HAVL e
havl0 HAVL e
havl1 -> let havl1' :: HAVL e
havl1' = HAVL e -> e -> HAVL e -> HAVL e
forall e. HAVL e -> e -> HAVL e -> HAVL e
spliceHAVL HAVL e
havl1 e
e (AVL e -> Int# -> HAVL e
forall e. AVL e -> Int# -> HAVL e
HAVL AVL e
r Int#
hr)
in HAVL e
havl1' HAVL e -> SplitResult e -> SplitResult e
forall a b. a -> b -> b
`seq` HAVL e -> HAVL e -> SplitResult e
forall e. HAVL e -> HAVL e -> SplitResult e
All HAVL e
havl0 HAVL e
havl1'
splitAtR :: Int -> AVL e -> Either Int (AVL e, AVL e)
splitAtR :: forall e. Int -> AVL e -> Either Int (AVL e, AVL e)
splitAtR Int
n AVL e
_ | Int
n Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
0 = [Char] -> Either Int (AVL e, AVL e)
forall a. HasCallStack => [Char] -> a
error [Char]
"splitAtR: Negative argument."
splitAtR Int
0 AVL e
E = Int -> Either Int (AVL e, AVL e)
forall a b. a -> Either a b
Left Int
0
splitAtR Int
0 AVL e
t = (AVL e, AVL e) -> Either Int (AVL e, AVL e)
forall a b. b -> Either a b
Right (AVL e
t,AVL e
forall e. AVL e
E)
splitAtR ASINT(n) AVL e
t = case Int# -> AVL e -> Int# -> SplitResult e
forall e. Int# -> AVL e -> Int# -> SplitResult e
splitR Int#
n AVL e
t L(0) of
More Int#
n_ -> Int -> Either Int (AVL e, AVL e)
forall a b. a -> Either a b
Left ASINT(SUBINT(n,n_))
All (HAVL AVL e
l Int#
_) (HAVL AVL e
r Int#
_) -> (AVL e, AVL e) -> Either Int (AVL e, AVL e)
forall a b. b -> Either a b
Right (AVL e
l,AVL e
r)
splitR :: UINT -> AVL e -> UINT -> SplitResult e
splitR :: forall e. Int# -> AVL e -> Int# -> SplitResult e
splitR Int#
n AVL e
E Int#
_ = Int# -> SplitResult e
forall e. Int# -> SplitResult e
More Int#
n
splitR Int#
n (N AVL e
l e
e AVL e
r) Int#
h = Int# -> AVL e -> Int# -> e -> AVL e -> Int# -> SplitResult e
forall e.
Int# -> AVL e -> Int# -> e -> AVL e -> Int# -> SplitResult e
splitR_ Int#
n AVL e
l DECINT2(h) e r DECINT1(h)
splitR Int#
n (Z AVL e
l e
e AVL e
r) Int#
h = Int# -> AVL e -> Int# -> e -> AVL e -> Int# -> SplitResult e
forall e.
Int# -> AVL e -> Int# -> e -> AVL e -> Int# -> SplitResult e
splitR_ Int#
n AVL e
l DECINT1(h) e r DECINT1(h)
splitR Int#
n (P AVL e
l e
e AVL e
r) Int#
h = Int# -> AVL e -> Int# -> e -> AVL e -> Int# -> SplitResult e
forall e.
Int# -> AVL e -> Int# -> e -> AVL e -> Int# -> SplitResult e
splitR_ Int#
n AVL e
l DECINT1(h) e r DECINT2(h)
splitR_ :: UINT -> AVL e -> UINT -> e -> AVL e -> UINT -> SplitResult e
splitR_ :: forall e.
Int# -> AVL e -> Int# -> e -> AVL e -> Int# -> SplitResult e
splitR_ Int#
n AVL e
l Int#
hl e
e AVL e
r Int#
hr =
case Int# -> AVL e -> Int# -> SplitResult e
forall e. Int# -> AVL e -> Int# -> SplitResult e
splitR Int#
n AVL e
r Int#
hr of
More L(0) -> let lhavl = pushRHAVL (HAVL l hl) e; rhavl = HAVL r hr
in lhavl `seq` rhavl `seq` All lhavl rhavl
More L(1) -> case l of
E -> More L(0)
_ -> let rhavl = pushLHAVL e (HAVL r hr)
lhavl = HAVL l hl
in lhavl `seq` rhavl `seq` All lhavl rhavl
More Int#
n_ -> let sr :: SplitResult e
sr = Int# -> AVL e -> Int# -> SplitResult e
forall e. Int# -> AVL e -> Int# -> SplitResult e
splitR DECINT1(n_) l hl
in case SplitResult e
sr of
More Int#
_ -> SplitResult e
sr
All HAVL e
havl0 HAVL e
havl1 -> let havl1' :: HAVL e
havl1' = HAVL e -> e -> HAVL e -> HAVL e
forall e. HAVL e -> e -> HAVL e -> HAVL e
spliceHAVL HAVL e
havl1 e
e (AVL e -> Int# -> HAVL e
forall e. AVL e -> Int# -> HAVL e
HAVL AVL e
r Int#
hr)
in HAVL e
havl1' HAVL e -> SplitResult e -> SplitResult e
forall a b. a -> b -> b
`seq` HAVL e -> HAVL e -> SplitResult e
forall e. HAVL e -> HAVL e -> SplitResult e
All HAVL e
havl0 HAVL e
havl1'
All HAVL e
havl0 HAVL e
havl1 -> let havlO' :: HAVL e
havlO' = HAVL e -> e -> HAVL e -> HAVL e
forall e. HAVL e -> e -> HAVL e -> HAVL e
spliceHAVL (AVL e -> Int# -> HAVL e
forall e. AVL e -> Int# -> HAVL e
HAVL AVL e
l Int#
hl) e
e HAVL e
havl0
in HAVL e
havlO' HAVL e -> SplitResult e -> SplitResult e
forall a b. a -> b -> b
`seq` HAVL e -> HAVL e -> SplitResult e
forall e. HAVL e -> HAVL e -> SplitResult e
All HAVL e
havlO' HAVL e
havl1
data TakeResult e = AllTR (HAVL e)
| MoreTR {-# UNPACK #-} !UINT
takeL :: Int -> AVL e -> Either Int (AVL e)
takeL :: forall e. Int -> AVL e -> Either Int (AVL e)
takeL Int
n AVL e
_ | Int
n Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
0 = [Char] -> Either Int (AVL e)
forall a. HasCallStack => [Char] -> a
error [Char]
"takeL: Negative argument."
takeL Int
0 AVL e
E = Int -> Either Int (AVL e)
forall a b. a -> Either a b
Left Int
0
takeL Int
0 AVL e
_ = AVL e -> Either Int (AVL e)
forall a b. b -> Either a b
Right AVL e
forall e. AVL e
E
takeL ASINT(n) AVL e
t = case Int# -> AVL e -> Int# -> TakeResult e
forall e. Int# -> AVL e -> Int# -> TakeResult e
takeL_ Int#
n AVL e
t L(0) of
MoreTR Int#
n_ -> Int -> Either Int (AVL e)
forall a b. a -> Either a b
Left ASINT(SUBINT(n,n_))
AllTR (HAVL AVL e
t' Int#
_) -> AVL e -> Either Int (AVL e)
forall a b. b -> Either a b
Right AVL e
t'
takeL_ :: UINT -> AVL e -> UINT -> TakeResult e
takeL_ :: forall e. Int# -> AVL e -> Int# -> TakeResult e
takeL_ Int#
n AVL e
E Int#
_ = Int# -> TakeResult e
forall e. Int# -> TakeResult e
MoreTR Int#
n
takeL_ Int#
n (N AVL e
l e
e AVL e
r) Int#
h = Int# -> AVL e -> Int# -> e -> AVL e -> Int# -> TakeResult e
forall e.
Int# -> AVL e -> Int# -> e -> AVL e -> Int# -> TakeResult e
takeL__ Int#
n AVL e
l DECINT2(h) e r DECINT1(h)
takeL_ Int#
n (Z AVL e
l e
e AVL e
r) Int#
h = Int# -> AVL e -> Int# -> e -> AVL e -> Int# -> TakeResult e
forall e.
Int# -> AVL e -> Int# -> e -> AVL e -> Int# -> TakeResult e
takeL__ Int#
n AVL e
l DECINT1(h) e r DECINT1(h)
takeL_ Int#
n (P AVL e
l e
e AVL e
r) Int#
h = Int# -> AVL e -> Int# -> e -> AVL e -> Int# -> TakeResult e
forall e.
Int# -> AVL e -> Int# -> e -> AVL e -> Int# -> TakeResult e
takeL__ Int#
n AVL e
l DECINT1(h) e r DECINT2(h)
takeL__ :: UINT -> AVL e -> UINT -> e -> AVL e -> UINT -> TakeResult e
takeL__ :: forall e.
Int# -> AVL e -> Int# -> e -> AVL e -> Int# -> TakeResult e
takeL__ Int#
n AVL e
l Int#
hl e
e AVL e
r Int#
hr =
let takel :: TakeResult e
takel = Int# -> AVL e -> Int# -> TakeResult e
forall e. Int# -> AVL e -> Int# -> TakeResult e
takeL_ Int#
n AVL e
l Int#
hl
in case TakeResult e
takel of
MoreTR L(0) -> let lhavl = HAVL l hl
in lhavl `seq` AllTR lhavl
MoreTR L(1) -> case r of
E -> MoreTR L(0)
_ -> let lhavl = pushRHAVL (HAVL l hl) e
in lhavl `seq` AllTR lhavl
MoreTR Int#
n_ -> let taker :: TakeResult e
taker = Int# -> AVL e -> Int# -> TakeResult e
forall e. Int# -> AVL e -> Int# -> TakeResult e
takeL_ DECINT1(n_) r hr
in case TakeResult e
taker of
AllTR HAVL e
havl0 -> let havl0' :: HAVL e
havl0' = HAVL e -> e -> HAVL e -> HAVL e
forall e. HAVL e -> e -> HAVL e -> HAVL e
spliceHAVL (AVL e -> Int# -> HAVL e
forall e. AVL e -> Int# -> HAVL e
HAVL AVL e
l Int#
hl) e
e HAVL e
havl0
in HAVL e
havl0' HAVL e -> TakeResult e -> TakeResult e
forall a b. a -> b -> b
`seq` HAVL e -> TakeResult e
forall e. HAVL e -> TakeResult e
AllTR HAVL e
havl0'
TakeResult e
_ -> TakeResult e
taker
TakeResult e
_ -> TakeResult e
takel
takeR :: Int -> AVL e -> Either Int (AVL e)
takeR :: forall e. Int -> AVL e -> Either Int (AVL e)
takeR Int
n AVL e
_ | Int
n Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
0 = [Char] -> Either Int (AVL e)
forall a. HasCallStack => [Char] -> a
error [Char]
"takeR: Negative argument."
takeR Int
0 AVL e
E = Int -> Either Int (AVL e)
forall a b. a -> Either a b
Left Int
0
takeR Int
0 AVL e
_ = AVL e -> Either Int (AVL e)
forall a b. b -> Either a b
Right AVL e
forall e. AVL e
E
takeR ASINT(n) AVL e
t = case Int# -> AVL e -> Int# -> TakeResult e
forall e. Int# -> AVL e -> Int# -> TakeResult e
takeR_ Int#
n AVL e
t L(0) of
MoreTR Int#
n_ -> Int -> Either Int (AVL e)
forall a b. a -> Either a b
Left ASINT(SUBINT(n,n_))
AllTR (HAVL AVL e
t' Int#
_) -> AVL e -> Either Int (AVL e)
forall a b. b -> Either a b
Right AVL e
t'
takeR_ :: UINT -> AVL e -> UINT -> TakeResult e
takeR_ :: forall e. Int# -> AVL e -> Int# -> TakeResult e
takeR_ Int#
n AVL e
E Int#
_ = Int# -> TakeResult e
forall e. Int# -> TakeResult e
MoreTR Int#
n
takeR_ Int#
n (N AVL e
l e
e AVL e
r) Int#
h = Int# -> AVL e -> Int# -> e -> AVL e -> Int# -> TakeResult e
forall e.
Int# -> AVL e -> Int# -> e -> AVL e -> Int# -> TakeResult e
takeR__ Int#
n AVL e
l DECINT2(h) e r DECINT1(h)
takeR_ Int#
n (Z AVL e
l e
e AVL e
r) Int#
h = Int# -> AVL e -> Int# -> e -> AVL e -> Int# -> TakeResult e
forall e.
Int# -> AVL e -> Int# -> e -> AVL e -> Int# -> TakeResult e
takeR__ Int#
n AVL e
l DECINT1(h) e r DECINT1(h)
takeR_ Int#
n (P AVL e
l e
e AVL e
r) Int#
h = Int# -> AVL e -> Int# -> e -> AVL e -> Int# -> TakeResult e
forall e.
Int# -> AVL e -> Int# -> e -> AVL e -> Int# -> TakeResult e
takeR__ Int#
n AVL e
l DECINT1(h) e r DECINT2(h)
takeR__ :: UINT -> AVL e -> UINT -> e -> AVL e -> UINT -> TakeResult e
takeR__ :: forall e.
Int# -> AVL e -> Int# -> e -> AVL e -> Int# -> TakeResult e
takeR__ Int#
n AVL e
l Int#
hl e
e AVL e
r Int#
hr =
let taker :: TakeResult e
taker = Int# -> AVL e -> Int# -> TakeResult e
forall e. Int# -> AVL e -> Int# -> TakeResult e
takeR_ Int#
n AVL e
r Int#
hr
in case TakeResult e
taker of
MoreTR L(0) -> let rhavl = HAVL r hr
in rhavl `seq` AllTR rhavl
MoreTR L(1) -> case l of
E -> MoreTR L(0)
_ -> let rhavl = pushLHAVL e (HAVL r hr)
in rhavl `seq` AllTR rhavl
MoreTR Int#
n_ -> let takel :: TakeResult e
takel = Int# -> AVL e -> Int# -> TakeResult e
forall e. Int# -> AVL e -> Int# -> TakeResult e
takeR_ DECINT1(n_) l hl
in case TakeResult e
takel of
AllTR HAVL e
havl0 -> let havl0' :: HAVL e
havl0' = HAVL e -> e -> HAVL e -> HAVL e
forall e. HAVL e -> e -> HAVL e -> HAVL e
spliceHAVL HAVL e
havl0 e
e (AVL e -> Int# -> HAVL e
forall e. AVL e -> Int# -> HAVL e
HAVL AVL e
r Int#
hr)
in HAVL e
havl0' HAVL e -> TakeResult e -> TakeResult e
forall a b. a -> b -> b
`seq` HAVL e -> TakeResult e
forall e. HAVL e -> TakeResult e
AllTR HAVL e
havl0'
TakeResult e
_ -> TakeResult e
takel
TakeResult e
_ -> TakeResult e
taker
dropL :: Int -> AVL e -> Either Int (AVL e)
dropL :: forall e. Int -> AVL e -> Either Int (AVL e)
dropL Int
n AVL e
_ | Int
n Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
0 = [Char] -> Either Int (AVL e)
forall a. HasCallStack => [Char] -> a
error [Char]
"dropL: Negative argument."
dropL Int
0 AVL e
E = Int -> Either Int (AVL e)
forall a b. a -> Either a b
Left Int
0
dropL Int
0 AVL e
t = AVL e -> Either Int (AVL e)
forall a b. b -> Either a b
Right AVL e
t
dropL ASINT(n) AVL e
t = case Int# -> AVL e -> Int# -> TakeResult e
forall e. Int# -> AVL e -> Int# -> TakeResult e
dropL_ Int#
n AVL e
t L(0) of
MoreTR Int#
n_ -> Int -> Either Int (AVL e)
forall a b. a -> Either a b
Left ASINT(SUBINT(n,n_))
AllTR (HAVL AVL e
r Int#
_) -> AVL e -> Either Int (AVL e)
forall a b. b -> Either a b
Right AVL e
r
dropL_ :: UINT -> AVL e -> UINT -> TakeResult e
dropL_ :: forall e. Int# -> AVL e -> Int# -> TakeResult e
dropL_ Int#
n AVL e
E Int#
_ = Int# -> TakeResult e
forall e. Int# -> TakeResult e
MoreTR Int#
n
dropL_ Int#
n (N AVL e
l e
e AVL e
r) Int#
h = Int# -> AVL e -> Int# -> e -> AVL e -> Int# -> TakeResult e
forall e.
Int# -> AVL e -> Int# -> e -> AVL e -> Int# -> TakeResult e
dropL__ Int#
n AVL e
l DECINT2(h) e r DECINT1(h)
dropL_ Int#
n (Z AVL e
l e
e AVL e
r) Int#
h = Int# -> AVL e -> Int# -> e -> AVL e -> Int# -> TakeResult e
forall e.
Int# -> AVL e -> Int# -> e -> AVL e -> Int# -> TakeResult e
dropL__ Int#
n AVL e
l DECINT1(h) e r DECINT1(h)
dropL_ Int#
n (P AVL e
l e
e AVL e
r) Int#
h = Int# -> AVL e -> Int# -> e -> AVL e -> Int# -> TakeResult e
forall e.
Int# -> AVL e -> Int# -> e -> AVL e -> Int# -> TakeResult e
dropL__ Int#
n AVL e
l DECINT1(h) e r DECINT2(h)
dropL__ :: UINT -> AVL e -> UINT -> e -> AVL e -> UINT -> TakeResult e
dropL__ :: forall e.
Int# -> AVL e -> Int# -> e -> AVL e -> Int# -> TakeResult e
dropL__ Int#
n AVL e
l Int#
hl e
e AVL e
r Int#
hr =
case Int# -> AVL e -> Int# -> TakeResult e
forall e. Int# -> AVL e -> Int# -> TakeResult e
dropL_ Int#
n AVL e
l Int#
hl of
MoreTR L(0) -> let rhavl = pushLHAVL e (HAVL r hr)
in rhavl `seq` AllTR rhavl
MoreTR L(1) -> case r of
E -> MoreTR L(0)
_ -> let rhavl = HAVL r hr in rhavl `seq` AllTR rhavl
MoreTR Int#
n_ -> Int# -> AVL e -> Int# -> TakeResult e
forall e. Int# -> AVL e -> Int# -> TakeResult e
dropL_ DECINT1(n_) r hr
AllTR HAVL e
havl1 -> let havl1' :: HAVL e
havl1' = HAVL e -> e -> HAVL e -> HAVL e
forall e. HAVL e -> e -> HAVL e -> HAVL e
spliceHAVL HAVL e
havl1 e
e (AVL e -> Int# -> HAVL e
forall e. AVL e -> Int# -> HAVL e
HAVL AVL e
r Int#
hr)
in HAVL e
havl1' HAVL e -> TakeResult e -> TakeResult e
forall a b. a -> b -> b
`seq` HAVL e -> TakeResult e
forall e. HAVL e -> TakeResult e
AllTR HAVL e
havl1'
dropR :: Int -> AVL e -> Either Int (AVL e)
dropR :: forall e. Int -> AVL e -> Either Int (AVL e)
dropR Int
n AVL e
_ | Int
n Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
0 = [Char] -> Either Int (AVL e)
forall a. HasCallStack => [Char] -> a
error [Char]
"dropL: Negative argument."
dropR Int
0 AVL e
E = Int -> Either Int (AVL e)
forall a b. a -> Either a b
Left Int
0
dropR Int
0 AVL e
t = AVL e -> Either Int (AVL e)
forall a b. b -> Either a b
Right AVL e
t
dropR ASINT(n) AVL e
t = case Int# -> AVL e -> Int# -> TakeResult e
forall e. Int# -> AVL e -> Int# -> TakeResult e
dropR_ Int#
n AVL e
t L(0) of
MoreTR Int#
n_ -> Int -> Either Int (AVL e)
forall a b. a -> Either a b
Left ASINT(SUBINT(n,n_))
AllTR (HAVL AVL e
l Int#
_) -> AVL e -> Either Int (AVL e)
forall a b. b -> Either a b
Right AVL e
l
dropR_ :: UINT -> AVL e -> UINT -> TakeResult e
dropR_ :: forall e. Int# -> AVL e -> Int# -> TakeResult e
dropR_ Int#
n AVL e
E Int#
_ = Int# -> TakeResult e
forall e. Int# -> TakeResult e
MoreTR Int#
n
dropR_ Int#
n (N AVL e
l e
e AVL e
r) Int#
h = Int# -> AVL e -> Int# -> e -> AVL e -> Int# -> TakeResult e
forall e.
Int# -> AVL e -> Int# -> e -> AVL e -> Int# -> TakeResult e
dropR__ Int#
n AVL e
l DECINT2(h) e r DECINT1(h)
dropR_ Int#
n (Z AVL e
l e
e AVL e
r) Int#
h = Int# -> AVL e -> Int# -> e -> AVL e -> Int# -> TakeResult e
forall e.
Int# -> AVL e -> Int# -> e -> AVL e -> Int# -> TakeResult e
dropR__ Int#
n AVL e
l DECINT1(h) e r DECINT1(h)
dropR_ Int#
n (P AVL e
l e
e AVL e
r) Int#
h = Int# -> AVL e -> Int# -> e -> AVL e -> Int# -> TakeResult e
forall e.
Int# -> AVL e -> Int# -> e -> AVL e -> Int# -> TakeResult e
dropR__ Int#
n AVL e
l DECINT1(h) e r DECINT2(h)
dropR__ :: UINT -> AVL e -> UINT -> e -> AVL e -> UINT -> TakeResult e
dropR__ :: forall e.
Int# -> AVL e -> Int# -> e -> AVL e -> Int# -> TakeResult e
dropR__ Int#
n AVL e
l Int#
hl e
e AVL e
r Int#
hr =
case Int# -> AVL e -> Int# -> TakeResult e
forall e. Int# -> AVL e -> Int# -> TakeResult e
dropR_ Int#
n AVL e
r Int#
hr of
MoreTR L(0) -> let lhavl = pushRHAVL (HAVL l hl) e
in lhavl `seq` AllTR lhavl
MoreTR L(1) -> case l of
E -> MoreTR L(0)
_ -> let lhavl = HAVL l hl in lhavl `seq` AllTR lhavl
MoreTR Int#
n_ -> Int# -> AVL e -> Int# -> TakeResult e
forall e. Int# -> AVL e -> Int# -> TakeResult e
dropR_ DECINT1(n_) l hl
AllTR HAVL e
havl0 -> let havl0' :: HAVL e
havl0' = HAVL e -> e -> HAVL e -> HAVL e
forall e. HAVL e -> e -> HAVL e -> HAVL e
spliceHAVL (AVL e -> Int# -> HAVL e
forall e. AVL e -> Int# -> HAVL e
HAVL AVL e
l Int#
hl) e
e HAVL e
havl0
in HAVL e
havl0' HAVL e -> TakeResult e -> TakeResult e
forall a b. a -> b -> b
`seq` HAVL e -> TakeResult e
forall e. HAVL e -> TakeResult e
AllTR HAVL e
havl0'
data SpanResult e = Some (HAVL e) (HAVL e)
| TheLot
spanL :: (e -> Bool) -> AVL e -> (AVL e, AVL e)
spanL :: forall e. (e -> Bool) -> AVL e -> (AVL e, AVL e)
spanL e -> Bool
p AVL e
t = case AVL e -> Int# -> SpanResult e
spanIt AVL e
t L(0) of
SpanResult e
TheLot -> (AVL e
t, AVL e
forall e. AVL e
E)
Some (HAVL AVL e
l Int#
_) (HAVL AVL e
r Int#
_) -> (AVL e
l, AVL e
r)
where
spanIt :: AVL e -> Int# -> SpanResult e
spanIt AVL e
E Int#
_ = SpanResult e
forall e. SpanResult e
TheLot
spanIt (N AVL e
l e
e AVL e
r) Int#
h = AVL e -> Int# -> e -> AVL e -> Int# -> SpanResult e
spanIt_ AVL e
l DECINT2(h) e r DECINT1(h)
spanIt (Z AVL e
l e
e AVL e
r) Int#
h = AVL e -> Int# -> e -> AVL e -> Int# -> SpanResult e
spanIt_ AVL e
l DECINT1(h) e r DECINT1(h)
spanIt (P AVL e
l e
e AVL e
r) Int#
h = AVL e -> Int# -> e -> AVL e -> Int# -> SpanResult e
spanIt_ AVL e
l DECINT1(h) e r DECINT2(h)
spanIt_ :: AVL e -> Int# -> e -> AVL e -> Int# -> SpanResult e
spanIt_ AVL e
l Int#
hl e
e AVL e
r Int#
hr =
case AVL e -> Int# -> SpanResult e
spanIt AVL e
l Int#
hl of
Some HAVL e
havl0 HAVL e
havl1 -> let havl1_ :: HAVL e
havl1_ = HAVL e -> e -> HAVL e -> HAVL e
forall e. HAVL e -> e -> HAVL e -> HAVL e
spliceHAVL HAVL e
havl1 e
e (AVL e -> Int# -> HAVL e
forall e. AVL e -> Int# -> HAVL e
HAVL AVL e
r Int#
hr)
in HAVL e
havl1_ HAVL e -> SpanResult e -> SpanResult e
forall a b. a -> b -> b
`seq` HAVL e -> HAVL e -> SpanResult e
forall e. HAVL e -> HAVL e -> SpanResult e
Some HAVL e
havl0 HAVL e
havl1_
SpanResult e
TheLot -> if e -> Bool
p e
e
then let spanItr :: SpanResult e
spanItr = AVL e -> Int# -> SpanResult e
spanIt AVL e
r Int#
hr
in case SpanResult e
spanItr of
Some HAVL e
havl0 HAVL e
havl1 -> let havl0_ :: HAVL e
havl0_ = HAVL e -> e -> HAVL e -> HAVL e
forall e. HAVL e -> e -> HAVL e -> HAVL e
spliceHAVL (AVL e -> Int# -> HAVL e
forall e. AVL e -> Int# -> HAVL e
HAVL AVL e
l Int#
hl) e
e HAVL e
havl0
in HAVL e
havl0_ HAVL e -> SpanResult e -> SpanResult e
forall a b. a -> b -> b
`seq` HAVL e -> HAVL e -> SpanResult e
forall e. HAVL e -> HAVL e -> SpanResult e
Some HAVL e
havl0_ HAVL e
havl1
SpanResult e
_ -> SpanResult e
spanItr
else let rhavl :: HAVL e
rhavl = e -> HAVL e -> HAVL e
forall e. e -> HAVL e -> HAVL e
pushLHAVL e
e (AVL e -> Int# -> HAVL e
forall e. AVL e -> Int# -> HAVL e
HAVL AVL e
r Int#
hr)
lhavl :: HAVL e
lhavl = AVL e -> Int# -> HAVL e
forall e. AVL e -> Int# -> HAVL e
HAVL AVL e
l Int#
hl
in HAVL e
lhavl HAVL e -> SpanResult e -> SpanResult e
forall a b. a -> b -> b
`seq` HAVL e
rhavl HAVL e -> SpanResult e -> SpanResult e
forall a b. a -> b -> b
`seq` HAVL e -> HAVL e -> SpanResult e
forall e. HAVL e -> HAVL e -> SpanResult e
Some HAVL e
lhavl HAVL e
rhavl
spanR :: (e -> Bool) -> AVL e -> (AVL e, AVL e)
spanR :: forall e. (e -> Bool) -> AVL e -> (AVL e, AVL e)
spanR e -> Bool
p AVL e
t = case AVL e -> Int# -> SpanResult e
spanIt AVL e
t L(0) of
SpanResult e
TheLot -> (AVL e
forall e. AVL e
E, AVL e
t)
Some (HAVL AVL e
l Int#
_) (HAVL AVL e
r Int#
_) -> (AVL e
l, AVL e
r)
where
spanIt :: AVL e -> Int# -> SpanResult e
spanIt AVL e
E Int#
_ = SpanResult e
forall e. SpanResult e
TheLot
spanIt (N AVL e
l e
e AVL e
r) Int#
h = AVL e -> Int# -> e -> AVL e -> Int# -> SpanResult e
spanIt_ AVL e
l DECINT2(h) e r DECINT1(h)
spanIt (Z AVL e
l e
e AVL e
r) Int#
h = AVL e -> Int# -> e -> AVL e -> Int# -> SpanResult e
spanIt_ AVL e
l DECINT1(h) e r DECINT1(h)
spanIt (P AVL e
l e
e AVL e
r) Int#
h = AVL e -> Int# -> e -> AVL e -> Int# -> SpanResult e
spanIt_ AVL e
l DECINT1(h) e r DECINT2(h)
spanIt_ :: AVL e -> Int# -> e -> AVL e -> Int# -> SpanResult e
spanIt_ AVL e
l Int#
hl e
e AVL e
r Int#
hr =
case AVL e -> Int# -> SpanResult e
spanIt AVL e
r Int#
hr of
Some HAVL e
havl0 HAVL e
havl1 -> let havl0_ :: HAVL e
havl0_ = HAVL e -> e -> HAVL e -> HAVL e
forall e. HAVL e -> e -> HAVL e -> HAVL e
spliceHAVL (AVL e -> Int# -> HAVL e
forall e. AVL e -> Int# -> HAVL e
HAVL AVL e
l Int#
hl) e
e HAVL e
havl0
in HAVL e
havl0_ HAVL e -> SpanResult e -> SpanResult e
forall a b. a -> b -> b
`seq` HAVL e -> HAVL e -> SpanResult e
forall e. HAVL e -> HAVL e -> SpanResult e
Some HAVL e
havl0_ HAVL e
havl1
SpanResult e
TheLot -> if e -> Bool
p e
e
then let spanItl :: SpanResult e
spanItl = AVL e -> Int# -> SpanResult e
spanIt AVL e
l Int#
hl
in case SpanResult e
spanItl of
Some HAVL e
havl0 HAVL e
havl1 -> let havl1_ :: HAVL e
havl1_ = HAVL e -> e -> HAVL e -> HAVL e
forall e. HAVL e -> e -> HAVL e -> HAVL e
spliceHAVL HAVL e
havl1 e
e (AVL e -> Int# -> HAVL e
forall e. AVL e -> Int# -> HAVL e
HAVL AVL e
r Int#
hr)
in HAVL e
havl1_ HAVL e -> SpanResult e -> SpanResult e
forall a b. a -> b -> b
`seq` HAVL e -> HAVL e -> SpanResult e
forall e. HAVL e -> HAVL e -> SpanResult e
Some HAVL e
havl0 HAVL e
havl1_
SpanResult e
_ -> SpanResult e
spanItl
else let lhavl :: HAVL e
lhavl = HAVL e -> e -> HAVL e
forall e. HAVL e -> e -> HAVL e
pushRHAVL (AVL e -> Int# -> HAVL e
forall e. AVL e -> Int# -> HAVL e
HAVL AVL e
l Int#
hl) e
e
rhavl :: HAVL e
rhavl = AVL e -> Int# -> HAVL e
forall e. AVL e -> Int# -> HAVL e
HAVL AVL e
r Int#
hr
in HAVL e
lhavl HAVL e -> SpanResult e -> SpanResult e
forall a b. a -> b -> b
`seq` HAVL e
rhavl HAVL e -> SpanResult e -> SpanResult e
forall a b. a -> b -> b
`seq` HAVL e -> HAVL e -> SpanResult e
forall e. HAVL e -> HAVL e -> SpanResult e
Some HAVL e
lhavl HAVL e
rhavl
data TakeWhileResult e = SomeTW (HAVL e)
| TheLotTW
takeWhileL :: (e -> Bool) -> AVL e -> AVL e
takeWhileL :: forall e. (e -> Bool) -> AVL e -> AVL e
takeWhileL e -> Bool
p AVL e
t = case AVL e -> Int# -> TakeWhileResult e
spanIt AVL e
t L(0) of
TakeWhileResult e
TheLotTW -> AVL e
t
SomeTW (HAVL AVL e
l Int#
_) -> AVL e
l
where
spanIt :: AVL e -> Int# -> TakeWhileResult e
spanIt AVL e
E Int#
_ = TakeWhileResult e
forall e. TakeWhileResult e
TheLotTW
spanIt (N AVL e
l e
e AVL e
r) Int#
h = AVL e -> Int# -> e -> AVL e -> Int# -> TakeWhileResult e
spanIt_ AVL e
l DECINT2(h) e r DECINT1(h)
spanIt (Z AVL e
l e
e AVL e
r) Int#
h = AVL e -> Int# -> e -> AVL e -> Int# -> TakeWhileResult e
spanIt_ AVL e
l DECINT1(h) e r DECINT1(h)
spanIt (P AVL e
l e
e AVL e
r) Int#
h = AVL e -> Int# -> e -> AVL e -> Int# -> TakeWhileResult e
spanIt_ AVL e
l DECINT1(h) e r DECINT2(h)
spanIt_ :: AVL e -> Int# -> e -> AVL e -> Int# -> TakeWhileResult e
spanIt_ AVL e
l Int#
hl e
e AVL e
r Int#
hr =
let twl :: TakeWhileResult e
twl = AVL e -> Int# -> TakeWhileResult e
spanIt AVL e
l Int#
hl
in case TakeWhileResult e
twl of
TakeWhileResult e
TheLotTW -> if e -> Bool
p e
e
then let twr :: TakeWhileResult e
twr = AVL e -> Int# -> TakeWhileResult e
spanIt AVL e
r Int#
hr
in case TakeWhileResult e
twr of
SomeTW HAVL e
havl0 -> let havl0_ :: HAVL e
havl0_ = HAVL e -> e -> HAVL e -> HAVL e
forall e. HAVL e -> e -> HAVL e -> HAVL e
spliceHAVL (AVL e -> Int# -> HAVL e
forall e. AVL e -> Int# -> HAVL e
HAVL AVL e
l Int#
hl) e
e HAVL e
havl0
in HAVL e
havl0_ HAVL e -> TakeWhileResult e -> TakeWhileResult e
forall a b. a -> b -> b
`seq` HAVL e -> TakeWhileResult e
forall e. HAVL e -> TakeWhileResult e
SomeTW HAVL e
havl0_
TakeWhileResult e
_ -> TakeWhileResult e
twr
else let lhavl :: HAVL e
lhavl = AVL e -> Int# -> HAVL e
forall e. AVL e -> Int# -> HAVL e
HAVL AVL e
l Int#
hl in HAVL e
lhavl HAVL e -> TakeWhileResult e -> TakeWhileResult e
forall a b. a -> b -> b
`seq` HAVL e -> TakeWhileResult e
forall e. HAVL e -> TakeWhileResult e
SomeTW HAVL e
lhavl
TakeWhileResult e
_ -> TakeWhileResult e
twl
takeWhileR :: (e -> Bool) -> AVL e -> AVL e
takeWhileR :: forall e. (e -> Bool) -> AVL e -> AVL e
takeWhileR e -> Bool
p AVL e
t = case AVL e -> Int# -> TakeWhileResult e
spanIt AVL e
t L(0) of
TakeWhileResult e
TheLotTW -> AVL e
t
SomeTW (HAVL AVL e
r Int#
_) -> AVL e
r
where
spanIt :: AVL e -> Int# -> TakeWhileResult e
spanIt AVL e
E Int#
_ = TakeWhileResult e
forall e. TakeWhileResult e
TheLotTW
spanIt (N AVL e
l e
e AVL e
r) Int#
h = AVL e -> Int# -> e -> AVL e -> Int# -> TakeWhileResult e
spanIt_ AVL e
l DECINT2(h) e r DECINT1(h)
spanIt (Z AVL e
l e
e AVL e
r) Int#
h = AVL e -> Int# -> e -> AVL e -> Int# -> TakeWhileResult e
spanIt_ AVL e
l DECINT1(h) e r DECINT1(h)
spanIt (P AVL e
l e
e AVL e
r) Int#
h = AVL e -> Int# -> e -> AVL e -> Int# -> TakeWhileResult e
spanIt_ AVL e
l DECINT1(h) e r DECINT2(h)
spanIt_ :: AVL e -> Int# -> e -> AVL e -> Int# -> TakeWhileResult e
spanIt_ AVL e
l Int#
hl e
e AVL e
r Int#
hr =
let twr :: TakeWhileResult e
twr = AVL e -> Int# -> TakeWhileResult e
spanIt AVL e
r Int#
hr
in case TakeWhileResult e
twr of
TakeWhileResult e
TheLotTW -> if e -> Bool
p e
e
then let twl :: TakeWhileResult e
twl = AVL e -> Int# -> TakeWhileResult e
spanIt AVL e
l Int#
hl
in case TakeWhileResult e
twl of
SomeTW HAVL e
havl1 -> let havl1_ :: HAVL e
havl1_ = HAVL e -> e -> HAVL e -> HAVL e
forall e. HAVL e -> e -> HAVL e -> HAVL e
spliceHAVL HAVL e
havl1 e
e (AVL e -> Int# -> HAVL e
forall e. AVL e -> Int# -> HAVL e
HAVL AVL e
r Int#
hr)
in HAVL e
havl1_ HAVL e -> TakeWhileResult e -> TakeWhileResult e
forall a b. a -> b -> b
`seq` HAVL e -> TakeWhileResult e
forall e. HAVL e -> TakeWhileResult e
SomeTW HAVL e
havl1_
TakeWhileResult e
_ -> TakeWhileResult e
twl
else let rhavl :: HAVL e
rhavl = AVL e -> Int# -> HAVL e
forall e. AVL e -> Int# -> HAVL e
HAVL AVL e
r Int#
hr in HAVL e
rhavl HAVL e -> TakeWhileResult e -> TakeWhileResult e
forall a b. a -> b -> b
`seq` HAVL e -> TakeWhileResult e
forall e. HAVL e -> TakeWhileResult e
SomeTW HAVL e
rhavl
TakeWhileResult e
_ -> TakeWhileResult e
twr
dropWhileL :: (e -> Bool) -> AVL e -> AVL e
dropWhileL :: forall e. (e -> Bool) -> AVL e -> AVL e
dropWhileL e -> Bool
p AVL e
t = case AVL e -> Int# -> TakeWhileResult e
spanIt AVL e
t L(0) of
TakeWhileResult e
TheLotTW -> AVL e
forall e. AVL e
E
SomeTW (HAVL AVL e
r Int#
_) -> AVL e
r
where
spanIt :: AVL e -> Int# -> TakeWhileResult e
spanIt AVL e
E Int#
_ = TakeWhileResult e
forall e. TakeWhileResult e
TheLotTW
spanIt (N AVL e
l e
e AVL e
r) Int#
h = AVL e -> Int# -> e -> AVL e -> Int# -> TakeWhileResult e
spanIt_ AVL e
l DECINT2(h) e r DECINT1(h)
spanIt (Z AVL e
l e
e AVL e
r) Int#
h = AVL e -> Int# -> e -> AVL e -> Int# -> TakeWhileResult e
spanIt_ AVL e
l DECINT1(h) e r DECINT1(h)
spanIt (P AVL e
l e
e AVL e
r) Int#
h = AVL e -> Int# -> e -> AVL e -> Int# -> TakeWhileResult e
spanIt_ AVL e
l DECINT1(h) e r DECINT2(h)
spanIt_ :: AVL e -> Int# -> e -> AVL e -> Int# -> TakeWhileResult e
spanIt_ AVL e
l Int#
hl e
e AVL e
r Int#
hr =
case AVL e -> Int# -> TakeWhileResult e
spanIt AVL e
l Int#
hl of
SomeTW HAVL e
havl1 -> let havl1_ :: HAVL e
havl1_ = HAVL e -> e -> HAVL e -> HAVL e
forall e. HAVL e -> e -> HAVL e -> HAVL e
spliceHAVL HAVL e
havl1 e
e (AVL e -> Int# -> HAVL e
forall e. AVL e -> Int# -> HAVL e
HAVL AVL e
r Int#
hr)
in HAVL e
havl1_ HAVL e -> TakeWhileResult e -> TakeWhileResult e
forall a b. a -> b -> b
`seq` HAVL e -> TakeWhileResult e
forall e. HAVL e -> TakeWhileResult e
SomeTW HAVL e
havl1_
TakeWhileResult e
TheLotTW -> if e -> Bool
p e
e
then AVL e -> Int# -> TakeWhileResult e
spanIt AVL e
r Int#
hr
else let rhavl :: HAVL e
rhavl = e -> HAVL e -> HAVL e
forall e. e -> HAVL e -> HAVL e
pushLHAVL e
e (AVL e -> Int# -> HAVL e
forall e. AVL e -> Int# -> HAVL e
HAVL AVL e
r Int#
hr)
in HAVL e
rhavl HAVL e -> TakeWhileResult e -> TakeWhileResult e
forall a b. a -> b -> b
`seq` HAVL e -> TakeWhileResult e
forall e. HAVL e -> TakeWhileResult e
SomeTW HAVL e
rhavl
dropWhileR :: (e -> Bool) -> AVL e -> AVL e
dropWhileR :: forall e. (e -> Bool) -> AVL e -> AVL e
dropWhileR e -> Bool
p AVL e
t = case AVL e -> Int# -> TakeWhileResult e
spanIt AVL e
t L(0) of
TakeWhileResult e
TheLotTW -> AVL e
forall e. AVL e
E
SomeTW (HAVL AVL e
l Int#
_) -> AVL e
l
where
spanIt :: AVL e -> Int# -> TakeWhileResult e
spanIt AVL e
E Int#
_ = TakeWhileResult e
forall e. TakeWhileResult e
TheLotTW
spanIt (N AVL e
l e
e AVL e
r) Int#
h = AVL e -> Int# -> e -> AVL e -> Int# -> TakeWhileResult e
spanIt_ AVL e
l DECINT2(h) e r DECINT1(h)
spanIt (Z AVL e
l e
e AVL e
r) Int#
h = AVL e -> Int# -> e -> AVL e -> Int# -> TakeWhileResult e
spanIt_ AVL e
l DECINT1(h) e r DECINT1(h)
spanIt (P AVL e
l e
e AVL e
r) Int#
h = AVL e -> Int# -> e -> AVL e -> Int# -> TakeWhileResult e
spanIt_ AVL e
l DECINT1(h) e r DECINT2(h)
spanIt_ :: AVL e -> Int# -> e -> AVL e -> Int# -> TakeWhileResult e
spanIt_ AVL e
l Int#
hl e
e AVL e
r Int#
hr =
case AVL e -> Int# -> TakeWhileResult e
spanIt AVL e
r Int#
hr of
SomeTW HAVL e
havl0 -> let havl0_ :: HAVL e
havl0_ = HAVL e -> e -> HAVL e -> HAVL e
forall e. HAVL e -> e -> HAVL e -> HAVL e
spliceHAVL (AVL e -> Int# -> HAVL e
forall e. AVL e -> Int# -> HAVL e
HAVL AVL e
l Int#
hl) e
e HAVL e
havl0
in HAVL e
havl0_ HAVL e -> TakeWhileResult e -> TakeWhileResult e
forall a b. a -> b -> b
`seq` HAVL e -> TakeWhileResult e
forall e. HAVL e -> TakeWhileResult e
SomeTW HAVL e
havl0_
TakeWhileResult e
TheLotTW -> if e -> Bool
p e
e
then AVL e -> Int# -> TakeWhileResult e
spanIt AVL e
l Int#
hl
else let lhavl :: HAVL e
lhavl = HAVL e -> e -> HAVL e
forall e. HAVL e -> e -> HAVL e
pushRHAVL (AVL e -> Int# -> HAVL e
forall e. AVL e -> Int# -> HAVL e
HAVL AVL e
l Int#
hl) e
e
in HAVL e
lhavl HAVL e -> TakeWhileResult e -> TakeWhileResult e
forall a b. a -> b -> b
`seq` HAVL e -> TakeWhileResult e
forall e. HAVL e -> TakeWhileResult e
SomeTW HAVL e
lhavl
rotateL :: AVL e -> AVL e
rotateL :: forall e. AVL e -> AVL e
rotateL AVL e
E = AVL e
forall e. AVL e
E
rotateL (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(e_,t) -> AVL e -> e -> AVL e
forall e. AVL e -> e -> AVL e
pushR AVL e
t e
e_
rotateL (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(e_,t) -> AVL e -> e -> AVL e
forall e. AVL e -> e -> AVL e
pushR AVL e
t e
e_
rotateL (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(e_,t) -> AVL e -> e -> AVL e
forall e. AVL e -> e -> AVL e
pushR AVL e
t e
e_
rotateR :: AVL e -> AVL e
rotateR :: forall e. AVL e -> AVL e
rotateR AVL e
E = AVL e
forall e. AVL e
E
rotateR (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(t,e_) -> e -> AVL e -> AVL e
forall e. e -> AVL e -> AVL e
pushL e
e_ AVL e
t
rotateR (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(t,e_) -> e -> AVL e -> AVL e
forall e. e -> AVL e -> AVL e
pushL e
e_ AVL e
t
rotateR (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(t,e_) -> e -> AVL e -> AVL e
forall e. e -> AVL e -> AVL e
pushL e
e_ AVL e
t
popRotateL :: AVL e -> (e, AVL e)
popRotateL :: forall e. AVL e -> (e, AVL e)
popRotateL AVL e
E = [Char] -> (e, AVL e)
forall a. HasCallStack => [Char] -> a
error [Char]
"popRotateL: Empty tree."
popRotateL (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(e_,t) -> e -> AVL e -> (e, AVL e)
forall e. e -> AVL e -> (e, AVL e)
popRotateL' e
e_ AVL e
t
popRotateL (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(e_,t) -> e -> AVL e -> (e, AVL e)
forall e. e -> AVL e -> (e, AVL e)
popRotateL' e
e_ AVL e
t
popRotateL (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(e_,t) -> e -> AVL e -> (e, AVL e)
forall e. e -> AVL e -> (e, AVL e)
popRotateL' e
e_ AVL e
t
popRotateL' :: e -> AVL e -> (e, AVL e)
popRotateL' :: forall e. e -> AVL e -> (e, AVL e)
popRotateL' e
e AVL e
t = let t' :: AVL e
t' = AVL e -> e -> AVL e
forall e. AVL e -> e -> AVL e
pushR AVL e
t e
e in AVL e
t' AVL e -> (e, AVL e) -> (e, AVL e)
forall a b. a -> b -> b
`seq` (e
e,AVL e
t')
popRotateR :: AVL e -> (AVL e, e)
popRotateR :: forall e. AVL e -> (AVL e, e)
popRotateR AVL e
E = [Char] -> (AVL e, e)
forall a. HasCallStack => [Char] -> a
error [Char]
"popRotateR: Empty tree."
popRotateR (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(t,e_) -> AVL e -> e -> (AVL e, e)
forall e. AVL e -> e -> (AVL e, e)
popRotateR' AVL e
t e
e_
popRotateR (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(t,e_) -> AVL e -> e -> (AVL e, e)
forall e. AVL e -> e -> (AVL e, e)
popRotateR' AVL e
t e
e_
popRotateR (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(t,e_) -> AVL e -> e -> (AVL e, e)
forall e. AVL e -> e -> (AVL e, e)
popRotateR' AVL e
t e
e_
popRotateR' :: AVL e -> e -> (AVL e, e)
popRotateR' :: forall e. AVL e -> e -> (AVL e, e)
popRotateR' AVL e
t e
e = let t' :: AVL e
t' = e -> AVL e -> AVL e
forall e. e -> AVL e -> AVL e
pushL e
e AVL e
t in AVL e
t' AVL e -> (AVL e, e) -> (AVL e, e)
forall a b. a -> b -> b
`seq` (AVL e
t',e
e)
rotateByL :: AVL e -> Int -> AVL e
rotateByL :: forall e. AVL e -> Int -> AVL e
rotateByL AVL e
t ASINT(n) = case Int# -> Int# -> Ordering
COMPAREUINT Int#
n L(0) of
Ordering
LT -> AVL e -> Int# -> AVL e
forall e. AVL e -> Int# -> AVL e
rotateByR__ AVL e
t NEGATE(n)
Ordering
EQ -> AVL e
t
Ordering
GT -> AVL e -> Int# -> AVL e
forall e. AVL e -> Int# -> AVL e
rotateByL__ AVL e
t Int#
n
{-# INLINE rotateByL_ #-}
rotateByL_ :: AVL e -> UINT -> AVL e
rotateByL_ :: forall e. AVL e -> Int# -> AVL e
rotateByL_ AVL e
t L(0) AVL e
= t
rotateByL_ AVL e
t Int#
n = AVL e -> Int# -> AVL e
forall e. AVL e -> Int# -> AVL e
rotateByL__ AVL e
t Int#
n
rotateByL__ :: AVL e -> UINT -> AVL e
rotateByL__ :: forall e. AVL e -> Int# -> AVL e
rotateByL__ AVL e
E Int#
_ = AVL e
forall e. AVL e
E
rotateByL__ AVL e
t Int#
n = case Int# -> AVL e -> Int# -> SplitResult e
forall e. Int# -> AVL e -> Int# -> SplitResult e
splitL Int#
n AVL e
t L(0) of
More L(0) -> t
More Int#
m -> let s :: Int#
s = SUBINT(n,m)
n_ :: Int#
n_ = _MODULO_(n,s)
in if Int# -> Bool
isTrue# (ADDINT(n_,n_) LEQ s)
then AVL e -> Int# -> AVL e
forall e. AVL e -> Int# -> AVL e
rotateByL_ AVL e
t Int#
n_
else AVL e -> Int# -> AVL e
forall e. AVL e -> Int# -> AVL e
rotateByR__ AVL e
t SUBINT(s,n_)
All (HAVL AVL e
l Int#
hl) (HAVL AVL e
r Int#
hr) -> AVL e -> Int# -> AVL e -> Int# -> AVL e
forall e. AVL e -> Int# -> AVL e -> Int# -> AVL e
joinH' AVL e
r Int#
hr AVL e
l Int#
hl
rotateByR :: AVL e -> Int -> AVL e
rotateByR :: forall e. AVL e -> Int -> AVL e
rotateByR AVL e
t ASINT(n) = case Int# -> Int# -> Ordering
COMPAREUINT Int#
n L(0) of
Ordering
LT -> AVL e -> Int# -> AVL e
forall e. AVL e -> Int# -> AVL e
rotateByL__ AVL e
t NEGATE(n)
Ordering
EQ -> AVL e
t
Ordering
GT -> AVL e -> Int# -> AVL e
forall e. AVL e -> Int# -> AVL e
rotateByR__ AVL e
t Int#
n
{-# INLINE rotateByR_ #-}
rotateByR_ :: AVL e -> UINT -> AVL e
rotateByR_ :: forall e. AVL e -> Int# -> AVL e
rotateByR_ AVL e
t L(0) AVL e
= t
rotateByR_ AVL e
t Int#
n = AVL e -> Int# -> AVL e
forall e. AVL e -> Int# -> AVL e
rotateByR__ AVL e
t Int#
n
rotateByR__ :: AVL e -> UINT -> AVL e
rotateByR__ :: forall e. AVL e -> Int# -> AVL e
rotateByR__ AVL e
E Int#
_ = AVL e
forall e. AVL e
E
rotateByR__ AVL e
t Int#
n = case Int# -> AVL e -> Int# -> SplitResult e
forall e. Int# -> AVL e -> Int# -> SplitResult e
splitR Int#
n AVL e
t L(0) of
More L(0) -> t
More Int#
m -> let s :: Int#
s = SUBINT(n,m)
n_ :: Int#
n_ = _MODULO_(n,s)
in if Int# -> Bool
isTrue# (ADDINT(n_,n_) LEQ s)
then AVL e -> Int# -> AVL e
forall e. AVL e -> Int# -> AVL e
rotateByR_ AVL e
t Int#
n_
else AVL e -> Int# -> AVL e
forall e. AVL e -> Int# -> AVL e
rotateByL__ AVL e
t SUBINT(s,n_)
All (HAVL AVL e
l Int#
hl) (HAVL AVL e
r Int#
hr) -> AVL e -> Int# -> AVL e -> Int# -> AVL e
forall e. AVL e -> Int# -> AVL e -> Int# -> AVL e
joinH' AVL e
r Int#
hr AVL e
l Int#
hl
forkL :: (e -> Ordering) -> AVL e -> (AVL e, AVL e)
forkL :: forall e. (e -> Ordering) -> AVL e -> (AVL e, AVL e)
forkL e -> Ordering
c AVL e
avl = let (HAVL AVL e
l Int#
_,HAVL AVL e
r Int#
_) = Int# -> AVL e -> (HAVL e, HAVL e)
forkL_ L(0) avl
in (AVL e
l,AVL e
r)
where
forkL_ :: Int# -> AVL e -> (HAVL e, HAVL e)
forkL_ Int#
h AVL e
E = (AVL e -> Int# -> HAVL e
forall e. AVL e -> Int# -> HAVL e
HAVL AVL e
forall e. AVL e
E Int#
h, AVL e -> Int# -> HAVL e
forall e. AVL e -> Int# -> HAVL e
HAVL AVL e
forall e. AVL e
E Int#
h)
forkL_ Int#
h (N AVL e
l e
e AVL e
r) = AVL e -> Int# -> e -> AVL e -> Int# -> (HAVL e, HAVL e)
forkL__ AVL e
l DECINT2(h) e r DECINT1(h)
forkL_ Int#
h (Z AVL e
l e
e AVL e
r) = AVL e -> Int# -> e -> AVL e -> Int# -> (HAVL e, HAVL e)
forkL__ AVL e
l DECINT1(h) e r DECINT1(h)
forkL_ Int#
h (P AVL e
l e
e AVL e
r) = AVL e -> Int# -> e -> AVL e -> Int# -> (HAVL e, HAVL e)
forkL__ AVL e
l DECINT1(h) e r DECINT2(h)
forkL__ :: AVL e -> Int# -> e -> AVL e -> Int# -> (HAVL e, HAVL e)
forkL__ AVL e
l Int#
hl e
e AVL e
r Int#
hr = case e -> Ordering
c e
e of
Ordering
LT -> let (HAVL e
havl0,HAVL e
havl1) = Int# -> AVL e -> (HAVL e, HAVL e)
forkL_ Int#
hl AVL e
l
havl1_ :: HAVL e
havl1_ = HAVL e -> e -> HAVL e -> HAVL e
forall e. HAVL e -> e -> HAVL e -> HAVL e
spliceHAVL HAVL e
havl1 e
e (AVL e -> Int# -> HAVL e
forall e. AVL e -> Int# -> HAVL e
HAVL AVL e
r Int#
hr)
in HAVL e
havl1_ HAVL e -> (HAVL e, HAVL e) -> (HAVL e, HAVL e)
forall a b. a -> b -> b
`seq` (HAVL e
havl0, HAVL e
havl1_)
Ordering
EQ -> let lhavl :: HAVL e
lhavl = HAVL e -> e -> HAVL e
forall e. HAVL e -> e -> HAVL e
pushRHAVL (AVL e -> Int# -> HAVL e
forall e. AVL e -> Int# -> HAVL e
HAVL AVL e
l Int#
hl) e
e
rhavl :: HAVL e
rhavl = AVL e -> Int# -> HAVL e
forall e. AVL e -> Int# -> HAVL e
HAVL AVL e
r Int#
hr
in HAVL e
lhavl HAVL e -> (HAVL e, HAVL e) -> (HAVL e, HAVL e)
forall a b. a -> b -> b
`seq` HAVL e
rhavl HAVL e -> (HAVL e, HAVL e) -> (HAVL e, HAVL e)
forall a b. a -> b -> b
`seq` (HAVL e
lhavl,HAVL e
rhavl)
Ordering
GT -> let (HAVL e
havl0,HAVL e
havl1) = Int# -> AVL e -> (HAVL e, HAVL e)
forkL_ Int#
hr AVL e
r
havl0_ :: HAVL e
havl0_ = HAVL e -> e -> HAVL e -> HAVL e
forall e. HAVL e -> e -> HAVL e -> HAVL e
spliceHAVL (AVL e -> Int# -> HAVL e
forall e. AVL e -> Int# -> HAVL e
HAVL AVL e
l Int#
hl) e
e HAVL e
havl0
in HAVL e
havl0_ HAVL e -> (HAVL e, HAVL e) -> (HAVL e, HAVL e)
forall a b. a -> b -> b
`seq` (HAVL e
havl0_, HAVL e
havl1)
forkR :: (e -> Ordering) -> AVL e -> (AVL e, AVL e)
forkR :: forall e. (e -> Ordering) -> AVL e -> (AVL e, AVL e)
forkR e -> Ordering
c AVL e
avl = let (HAVL AVL e
l Int#
_,HAVL AVL e
r Int#
_) = Int# -> AVL e -> (HAVL e, HAVL e)
forkR_ L(0) avl
in (AVL e
l,AVL e
r)
where
forkR_ :: Int# -> AVL e -> (HAVL e, HAVL e)
forkR_ Int#
h AVL e
E = (AVL e -> Int# -> HAVL e
forall e. AVL e -> Int# -> HAVL e
HAVL AVL e
forall e. AVL e
E Int#
h, AVL e -> Int# -> HAVL e
forall e. AVL e -> Int# -> HAVL e
HAVL AVL e
forall e. AVL e
E Int#
h)
forkR_ Int#
h (N AVL e
l e
e AVL e
r) = AVL e -> Int# -> e -> AVL e -> Int# -> (HAVL e, HAVL e)
forkR__ AVL e
l DECINT2(h) e r DECINT1(h)
forkR_ Int#
h (Z AVL e
l e
e AVL e
r) = AVL e -> Int# -> e -> AVL e -> Int# -> (HAVL e, HAVL e)
forkR__ AVL e
l DECINT1(h) e r DECINT1(h)
forkR_ Int#
h (P AVL e
l e
e AVL e
r) = AVL e -> Int# -> e -> AVL e -> Int# -> (HAVL e, HAVL e)
forkR__ AVL e
l DECINT1(h) e r DECINT2(h)
forkR__ :: AVL e -> Int# -> e -> AVL e -> Int# -> (HAVL e, HAVL e)
forkR__ AVL e
l Int#
hl e
e AVL e
r Int#
hr = case e -> Ordering
c e
e of
Ordering
LT -> let (HAVL e
havl0,HAVL e
havl1) = Int# -> AVL e -> (HAVL e, HAVL e)
forkR_ Int#
hl AVL e
l
havl1_ :: HAVL e
havl1_ = HAVL e -> e -> HAVL e -> HAVL e
forall e. HAVL e -> e -> HAVL e -> HAVL e
spliceHAVL HAVL e
havl1 e
e (AVL e -> Int# -> HAVL e
forall e. AVL e -> Int# -> HAVL e
HAVL AVL e
r Int#
hr)
in HAVL e
havl1_ HAVL e -> (HAVL e, HAVL e) -> (HAVL e, HAVL e)
forall a b. a -> b -> b
`seq` (HAVL e
havl0, HAVL e
havl1_)
Ordering
EQ -> let rhavl :: HAVL e
rhavl = e -> HAVL e -> HAVL e
forall e. e -> HAVL e -> HAVL e
pushLHAVL e
e (AVL e -> Int# -> HAVL e
forall e. AVL e -> Int# -> HAVL e
HAVL AVL e
r Int#
hr)
lhavl :: HAVL e
lhavl = AVL e -> Int# -> HAVL e
forall e. AVL e -> Int# -> HAVL e
HAVL AVL e
l Int#
hl
in HAVL e
lhavl HAVL e -> (HAVL e, HAVL e) -> (HAVL e, HAVL e)
forall a b. a -> b -> b
`seq` HAVL e
rhavl HAVL e -> (HAVL e, HAVL e) -> (HAVL e, HAVL e)
forall a b. a -> b -> b
`seq` (HAVL e
lhavl, HAVL e
rhavl)
Ordering
GT -> let (HAVL e
havl0,HAVL e
havl1) = Int# -> AVL e -> (HAVL e, HAVL e)
forkR_ Int#
hr AVL e
r
havl0_ :: HAVL e
havl0_ = HAVL e -> e -> HAVL e -> HAVL e
forall e. HAVL e -> e -> HAVL e -> HAVL e
spliceHAVL (AVL e -> Int# -> HAVL e
forall e. AVL e -> Int# -> HAVL e
HAVL AVL e
l Int#
hl) e
e HAVL e
havl0
in HAVL e
havl0_ HAVL e -> (HAVL e, HAVL e) -> (HAVL e, HAVL e)
forall a b. a -> b -> b
`seq` (HAVL e
havl0_, HAVL e
havl1)
fork :: (e -> COrdering a) -> AVL e -> (AVL e, Maybe a, AVL e)
fork :: forall e a. (e -> COrdering a) -> AVL e -> (AVL e, Maybe a, AVL e)
fork e -> COrdering a
c AVL e
avl = let (HAVL AVL e
l Int#
_, Maybe a
mba, HAVL AVL e
r Int#
_) = Int# -> AVL e -> (HAVL e, Maybe a, HAVL e)
fork_ L(0) avl
in (AVL e
l,Maybe a
mba,AVL e
r)
where
fork_ :: Int# -> AVL e -> (HAVL e, Maybe a, HAVL e)
fork_ Int#
h AVL e
E = (AVL e -> Int# -> HAVL e
forall e. AVL e -> Int# -> HAVL e
HAVL AVL e
forall e. AVL e
E Int#
h, Maybe a
forall a. Maybe a
Nothing, AVL e -> Int# -> HAVL e
forall e. AVL e -> Int# -> HAVL e
HAVL AVL e
forall e. AVL e
E Int#
h)
fork_ Int#
h (N AVL e
l e
e AVL e
r) = AVL e -> Int# -> e -> AVL e -> Int# -> (HAVL e, Maybe a, HAVL e)
fork__ AVL e
l DECINT2(h) e r DECINT1(h)
fork_ Int#
h (Z AVL e
l e
e AVL e
r) = AVL e -> Int# -> e -> AVL e -> Int# -> (HAVL e, Maybe a, HAVL e)
fork__ AVL e
l DECINT1(h) e r DECINT1(h)
fork_ Int#
h (P AVL e
l e
e AVL e
r) = AVL e -> Int# -> e -> AVL e -> Int# -> (HAVL e, Maybe a, HAVL e)
fork__ AVL e
l DECINT1(h) e r DECINT2(h)
fork__ :: AVL e -> Int# -> e -> AVL e -> Int# -> (HAVL e, Maybe a, HAVL e)
fork__ AVL e
l Int#
hl e
e AVL e
r Int#
hr = case e -> COrdering a
c e
e of
COrdering a
Lt -> let (HAVL e
havl0,Maybe a
mba,HAVL e
havl1) = Int# -> AVL e -> (HAVL e, Maybe a, HAVL e)
fork_ Int#
hl AVL e
l
havl1_ :: HAVL e
havl1_ = HAVL e -> e -> HAVL e -> HAVL e
forall e. HAVL e -> e -> HAVL e -> HAVL e
spliceHAVL HAVL e
havl1 e
e (AVL e -> Int# -> HAVL e
forall e. AVL e -> Int# -> HAVL e
HAVL AVL e
r Int#
hr)
in HAVL e
havl1_ HAVL e -> (HAVL e, Maybe a, HAVL e) -> (HAVL e, Maybe a, HAVL e)
forall a b. a -> b -> b
`seq` (HAVL e
havl0, Maybe a
mba, HAVL e
havl1_)
Eq a
a -> let lhavl :: HAVL e
lhavl = AVL e -> Int# -> HAVL e
forall e. AVL e -> Int# -> HAVL e
HAVL AVL e
l Int#
hl
rhavl :: HAVL e
rhavl = AVL e -> Int# -> HAVL e
forall e. AVL e -> Int# -> HAVL e
HAVL AVL e
r Int#
hr
in HAVL e
lhavl HAVL e -> (HAVL e, Maybe a, HAVL e) -> (HAVL e, Maybe a, HAVL e)
forall a b. a -> b -> b
`seq` HAVL e
rhavl HAVL e -> (HAVL e, Maybe a, HAVL e) -> (HAVL e, Maybe a, HAVL e)
forall a b. a -> b -> b
`seq` (HAVL e
lhavl, a -> Maybe a
forall a. a -> Maybe a
Just a
a, HAVL e
rhavl)
COrdering a
Gt -> let (HAVL e
havl0,Maybe a
mba,HAVL e
havl1) = Int# -> AVL e -> (HAVL e, Maybe a, HAVL e)
fork_ Int#
hr AVL e
r
havl0_ :: HAVL e
havl0_ = HAVL e -> e -> HAVL e -> HAVL e
forall e. HAVL e -> e -> HAVL e -> HAVL e
spliceHAVL (AVL e -> Int# -> HAVL e
forall e. AVL e -> Int# -> HAVL e
HAVL AVL e
l Int#
hl) e
e HAVL e
havl0
in HAVL e
havl0_ HAVL e -> (HAVL e, Maybe a, HAVL e) -> (HAVL e, Maybe a, HAVL e)
forall a b. a -> b -> b
`seq` (HAVL e
havl0_, Maybe a
mba, HAVL e
havl1)
takeLE :: (e -> Ordering) -> AVL e -> AVL e
takeLE :: forall e. (e -> Ordering) -> AVL e -> AVL e
takeLE e -> Ordering
c AVL e
avl = let HAVL AVL e
l Int#
_ = Int# -> AVL e -> HAVL e
forkL_ L(0) avl
in AVL e
l
where
forkL_ :: Int# -> AVL e -> HAVL e
forkL_ Int#
h AVL e
E = AVL e -> Int# -> HAVL e
forall e. AVL e -> Int# -> HAVL e
HAVL AVL e
forall e. AVL e
E Int#
h
forkL_ Int#
h (N AVL e
l e
e AVL e
r) = AVL e -> Int# -> e -> AVL e -> Int# -> HAVL e
forkL__ AVL e
l DECINT2(h) e r DECINT1(h)
forkL_ Int#
h (Z AVL e
l e
e AVL e
r) = AVL e -> Int# -> e -> AVL e -> Int# -> HAVL e
forkL__ AVL e
l DECINT1(h) e r DECINT1(h)
forkL_ Int#
h (P AVL e
l e
e AVL e
r) = AVL e -> Int# -> e -> AVL e -> Int# -> HAVL e
forkL__ AVL e
l DECINT1(h) e r DECINT2(h)
forkL__ :: AVL e -> Int# -> e -> AVL e -> Int# -> HAVL e
forkL__ AVL e
l Int#
hl e
e AVL e
r Int#
hr = case e -> Ordering
c e
e of
Ordering
LT -> Int# -> AVL e -> HAVL e
forkL_ Int#
hl AVL e
l
Ordering
EQ -> HAVL e -> e -> HAVL e
forall e. HAVL e -> e -> HAVL e
pushRHAVL (AVL e -> Int# -> HAVL e
forall e. AVL e -> Int# -> HAVL e
HAVL AVL e
l Int#
hl) e
e
Ordering
GT -> let havl0 :: HAVL e
havl0 = Int# -> AVL e -> HAVL e
forkL_ Int#
hr AVL e
r
in HAVL e -> e -> HAVL e -> HAVL e
forall e. HAVL e -> e -> HAVL e -> HAVL e
spliceHAVL (AVL e -> Int# -> HAVL e
forall e. AVL e -> Int# -> HAVL e
HAVL AVL e
l Int#
hl) e
e HAVL e
havl0
dropGT :: (e -> Ordering) -> AVL e -> AVL e
dropGT :: forall e. (e -> Ordering) -> AVL e -> AVL e
dropGT = (e -> Ordering) -> AVL e -> AVL e
forall e. (e -> Ordering) -> AVL e -> AVL e
takeLE
{-# INLINE dropGT #-}
takeGT :: (e -> Ordering) -> AVL e -> AVL e
takeGT :: forall e. (e -> Ordering) -> AVL e -> AVL e
takeGT e -> Ordering
c AVL e
avl = let HAVL AVL e
r Int#
_ = Int# -> AVL e -> HAVL e
forkL_ L(0) avl
in AVL e
r
where
forkL_ :: Int# -> AVL e -> HAVL e
forkL_ Int#
h AVL e
E = AVL e -> Int# -> HAVL e
forall e. AVL e -> Int# -> HAVL e
HAVL AVL e
forall e. AVL e
E Int#
h
forkL_ Int#
h (N AVL e
l e
e AVL e
r) = AVL e -> Int# -> e -> AVL e -> Int# -> HAVL e
forkL__ AVL e
l DECINT2(h) e r DECINT1(h)
forkL_ Int#
h (Z AVL e
l e
e AVL e
r) = AVL e -> Int# -> e -> AVL e -> Int# -> HAVL e
forkL__ AVL e
l DECINT1(h) e r DECINT1(h)
forkL_ Int#
h (P AVL e
l e
e AVL e
r) = AVL e -> Int# -> e -> AVL e -> Int# -> HAVL e
forkL__ AVL e
l DECINT1(h) e r DECINT2(h)
forkL__ :: AVL e -> Int# -> e -> AVL e -> Int# -> HAVL e
forkL__ AVL e
l Int#
hl e
e AVL e
r Int#
hr = case e -> Ordering
c e
e of
Ordering
LT -> let havl1 :: HAVL e
havl1 = Int# -> AVL e -> HAVL e
forkL_ Int#
hl AVL e
l
in HAVL e -> e -> HAVL e -> HAVL e
forall e. HAVL e -> e -> HAVL e -> HAVL e
spliceHAVL HAVL e
havl1 e
e (AVL e -> Int# -> HAVL e
forall e. AVL e -> Int# -> HAVL e
HAVL AVL e
r Int#
hr)
Ordering
EQ -> AVL e -> Int# -> HAVL e
forall e. AVL e -> Int# -> HAVL e
HAVL AVL e
r Int#
hr
Ordering
GT -> Int# -> AVL e -> HAVL e
forkL_ Int#
hr AVL e
r
dropLE :: (e -> Ordering) -> AVL e -> AVL e
dropLE :: forall e. (e -> Ordering) -> AVL e -> AVL e
dropLE = (e -> Ordering) -> AVL e -> AVL e
forall e. (e -> Ordering) -> AVL e -> AVL e
takeGT
{-# INLINE dropLE #-}
takeLT :: (e -> Ordering) -> AVL e -> AVL e
takeLT :: forall e. (e -> Ordering) -> AVL e -> AVL e
takeLT e -> Ordering
c AVL e
avl = let HAVL AVL e
l Int#
_ = Int# -> AVL e -> HAVL e
forkL_ L(0) avl
in AVL e
l
where
forkL_ :: Int# -> AVL e -> HAVL e
forkL_ Int#
h AVL e
E = AVL e -> Int# -> HAVL e
forall e. AVL e -> Int# -> HAVL e
HAVL AVL e
forall e. AVL e
E Int#
h
forkL_ Int#
h (N AVL e
l e
e AVL e
r) = AVL e -> Int# -> e -> AVL e -> Int# -> HAVL e
forkL__ AVL e
l DECINT2(h) e r DECINT1(h)
forkL_ Int#
h (Z AVL e
l e
e AVL e
r) = AVL e -> Int# -> e -> AVL e -> Int# -> HAVL e
forkL__ AVL e
l DECINT1(h) e r DECINT1(h)
forkL_ Int#
h (P AVL e
l e
e AVL e
r) = AVL e -> Int# -> e -> AVL e -> Int# -> HAVL e
forkL__ AVL e
l DECINT1(h) e r DECINT2(h)
forkL__ :: AVL e -> Int# -> e -> AVL e -> Int# -> HAVL e
forkL__ AVL e
l Int#
hl e
e AVL e
r Int#
hr = case e -> Ordering
c e
e of
Ordering
LT -> Int# -> AVL e -> HAVL e
forkL_ Int#
hl AVL e
l
Ordering
EQ -> AVL e -> Int# -> HAVL e
forall e. AVL e -> Int# -> HAVL e
HAVL AVL e
l Int#
hl
Ordering
GT -> let havl0 :: HAVL e
havl0 = Int# -> AVL e -> HAVL e
forkL_ Int#
hr AVL e
r
in HAVL e -> e -> HAVL e -> HAVL e
forall e. HAVL e -> e -> HAVL e -> HAVL e
spliceHAVL (AVL e -> Int# -> HAVL e
forall e. AVL e -> Int# -> HAVL e
HAVL AVL e
l Int#
hl) e
e HAVL e
havl0
dropGE :: (e -> Ordering) -> AVL e -> AVL e
dropGE :: forall e. (e -> Ordering) -> AVL e -> AVL e
dropGE = (e -> Ordering) -> AVL e -> AVL e
forall e. (e -> Ordering) -> AVL e -> AVL e
takeLT
{-# INLINE dropGE #-}
takeGE :: (e -> Ordering) -> AVL e -> AVL e
takeGE :: forall e. (e -> Ordering) -> AVL e -> AVL e
takeGE e -> Ordering
c AVL e
avl = let HAVL AVL e
r Int#
_ = Int# -> AVL e -> HAVL e
forkL_ L(0) avl
in AVL e
r
where
forkL_ :: Int# -> AVL e -> HAVL e
forkL_ Int#
h AVL e
E = AVL e -> Int# -> HAVL e
forall e. AVL e -> Int# -> HAVL e
HAVL AVL e
forall e. AVL e
E Int#
h
forkL_ Int#
h (N AVL e
l e
e AVL e
r) = AVL e -> Int# -> e -> AVL e -> Int# -> HAVL e
forkL__ AVL e
l DECINT2(h) e r DECINT1(h)
forkL_ Int#
h (Z AVL e
l e
e AVL e
r) = AVL e -> Int# -> e -> AVL e -> Int# -> HAVL e
forkL__ AVL e
l DECINT1(h) e r DECINT1(h)
forkL_ Int#
h (P AVL e
l e
e AVL e
r) = AVL e -> Int# -> e -> AVL e -> Int# -> HAVL e
forkL__ AVL e
l DECINT1(h) e r DECINT2(h)
forkL__ :: AVL e -> Int# -> e -> AVL e -> Int# -> HAVL e
forkL__ AVL e
l Int#
hl e
e AVL e
r Int#
hr = case e -> Ordering
c e
e of
Ordering
LT -> let havl1 :: HAVL e
havl1 = Int# -> AVL e -> HAVL e
forkL_ Int#
hl AVL e
l
in HAVL e -> e -> HAVL e -> HAVL e
forall e. HAVL e -> e -> HAVL e -> HAVL e
spliceHAVL HAVL e
havl1 e
e (AVL e -> Int# -> HAVL e
forall e. AVL e -> Int# -> HAVL e
HAVL AVL e
r Int#
hr)
Ordering
EQ -> e -> HAVL e -> HAVL e
forall e. e -> HAVL e -> HAVL e
pushLHAVL e
e (AVL e -> Int# -> HAVL e
forall e. AVL e -> Int# -> HAVL e
HAVL AVL e
r Int#
hr)
Ordering
GT -> Int# -> AVL e -> HAVL e
forkL_ Int#
hr AVL e
r
dropLT :: (e -> Ordering) -> AVL e -> AVL e
dropLT :: forall e. (e -> Ordering) -> AVL e -> AVL e
dropLT = (e -> Ordering) -> AVL e -> AVL e
forall e. (e -> Ordering) -> AVL e -> AVL e
takeGE
{-# INLINE dropLT #-}