{-# OPTIONS_HADDOCK hide #-}
module Data.Tree.AVL.Internals.HAVL
(
HAVL(HAVL),emptyHAVL,toHAVL,isEmptyHAVL,isNonEmptyHAVL,
spliceHAVL,joinHAVL,
pushLHAVL,pushRHAVL
) where
import Data.Tree.AVL.Internals.Types(AVL(..))
import Data.Tree.AVL.Height(addHeight)
import Data.Tree.AVL.Internals.HJoin(spliceH,joinH)
import Data.Tree.AVL.Internals.HPush(pushHL,pushHR)
import GHC.Base
#include "ghcdefs.h"
data HAVL e = HAVL (AVL e) {-# UNPACK #-} !UINT
emptyHAVL :: HAVL e
emptyHAVL :: forall e. HAVL e
emptyHAVL = AVL e -> Int# -> HAVL e
forall e. AVL e -> Int# -> HAVL e
HAVL AVL e
forall e. AVL e
E L(0)
{-# INLINE isEmptyHAVL #-}
isEmptyHAVL :: HAVL e -> Bool
isEmptyHAVL :: forall e. HAVL e -> Bool
isEmptyHAVL (HAVL AVL e
E Int#
_) = Bool
True
isEmptyHAVL (HAVL AVL e
_ Int#
_) = Bool
False
{-# INLINE isNonEmptyHAVL #-}
isNonEmptyHAVL :: HAVL e -> Bool
isNonEmptyHAVL :: forall e. HAVL e -> Bool
isNonEmptyHAVL (HAVL AVL e
E Int#
_) = Bool
False
isNonEmptyHAVL (HAVL AVL e
_ Int#
_) = Bool
True
toHAVL :: AVL e -> HAVL e
toHAVL :: forall e. AVL e -> HAVL e
toHAVL AVL e
t = AVL e -> Int# -> HAVL e
forall e. AVL e -> Int# -> HAVL e
HAVL AVL e
t (Int# -> AVL e -> Int#
forall e. Int# -> AVL e -> Int#
addHeight L(0AVL e
) t)
{-# INLINE spliceHAVL #-}
spliceHAVL :: HAVL e -> e -> HAVL e -> HAVL e
spliceHAVL :: forall e. HAVL e -> e -> HAVL e -> HAVL e
spliceHAVL (HAVL AVL e
l Int#
hl) e
e (HAVL AVL e
r Int#
hr) = case AVL e -> Int# -> e -> AVL e -> Int# -> (# AVL e, Int# #)
forall e. AVL e -> Int# -> e -> AVL e -> Int# -> (# AVL e, Int# #)
spliceH AVL e
l Int#
hl e
e AVL e
r Int#
hr of UBT2(t,ht) -> AVL e -> Int# -> HAVL e
forall e. AVL e -> Int# -> HAVL e
HAVL AVL e
t Int#
ht
{-# INLINE joinHAVL #-}
joinHAVL :: HAVL e -> HAVL e -> HAVL e
joinHAVL :: forall e. HAVL e -> HAVL e -> HAVL e
joinHAVL (HAVL AVL e
l Int#
hl) (HAVL AVL e
r Int#
hr) = case AVL e -> Int# -> AVL e -> Int# -> (# AVL e, Int# #)
forall e. AVL e -> Int# -> AVL e -> Int# -> (# AVL e, Int# #)
joinH AVL e
l Int#
hl AVL e
r Int#
hr of UBT2(t,ht) -> AVL e -> Int# -> HAVL e
forall e. AVL e -> Int# -> HAVL e
HAVL AVL e
t Int#
ht
{-# INLINE pushLHAVL #-}
pushLHAVL :: e -> HAVL e -> HAVL e
pushLHAVL :: forall e. e -> HAVL e -> HAVL e
pushLHAVL e
e (HAVL AVL e
t Int#
ht) = case e -> AVL e -> Int# -> (# AVL e, Int# #)
forall e. e -> AVL e -> Int# -> (# AVL e, Int# #)
pushHL e
e AVL e
t Int#
ht of UBT2(t_,ht_) -> AVL e -> Int# -> HAVL e
forall e. AVL e -> Int# -> HAVL e
HAVL AVL e
t_ Int#
ht_
{-# INLINE pushRHAVL #-}
pushRHAVL :: HAVL e -> e -> HAVL e
pushRHAVL :: forall e. HAVL e -> e -> HAVL e
pushRHAVL (HAVL AVL e
t Int#
ht) e
e = case AVL e -> Int# -> e -> (# AVL e, Int# #)
forall e. AVL e -> Int# -> e -> (# AVL e, Int# #)
pushHR AVL e
t Int#
ht e
e of UBT2(t_,ht_) -> AVL e -> Int# -> HAVL e
forall e. AVL e -> Int# -> HAVL e
HAVL AVL e
t_ Int#
ht_