target-0.2.0.0: test/RBTreeTest.hs
{-# LANGUAGE TemplateHaskell #-}
module RBTreeTest where
import RBTree
import Test.Target
type E = Char
type T = RBTree E
-- liquidTests :: [(String, Test)]
liquidTests = [ ('add, T (add :: E -> T -> T))
, ('remove, T (remove :: E -> T -> T))
]
-- liquidTests_bad :: [(String, Test)]
liquidTests_bad = [ ('add, T (add_bad :: E -> T -> T))
, ('remove, T (remove_bad :: E -> T -> T))
]
remove_bad x t = makeBlack (del_bad x t)
del_bad x Leaf = Leaf
del_bad x (Node _ y a b) = case compare x y of
EQ -> append_bad y a b
LT -> case a of
Leaf -> Node R y Leaf b
Node B _ _ _ -> lbalS y (del_bad x a) b
_ -> let t = Node R y (del_bad x a) b in t
GT -> case b of
Leaf -> Node R y a Leaf
Node B _ _ _ -> rbalS y a (del_bad x b)
_ -> Node R y a (del_bad x b)
append_bad :: a -> RBTree a -> RBTree a -> RBTree a
append_bad _ Leaf r = r
append_bad _ l Leaf = l
append_bad piv (Node R lx ll lr) (Node R rx rl rr) = case append_bad piv lr rl of
--Node R x lr' rl' -> Node R x (Node R lx ll lr') (Node R rx rl' rr)
lrl -> Node R lx ll (Node R rx lrl rr)
append_bad piv (Node B lx ll lr) (Node B rx rl rr) = case append_bad piv lr rl of
--Node R x lr' rl' -> Node R x (Node B lx ll lr') (Node B rx rl' rr)
lrl -> lbalS lx ll (Node B rx lrl rr)
append_bad piv l@(Node B _ _ _) (Node R rx rl rr) = Node R rx (append_bad piv l rl) rr
append_bad piv l@(Node R lx ll lr) r@(Node B _ _ _) = Node R lx ll (append_bad piv lr r)
add_bad x s = ins x s