alpha-0.9.9.5: src/My/Data/SetBy.hs
module My.Data.SetBy (SetBy
,empty,fromList,fromAscList
,null
,toList,toAscList
,insert,delete,member
,findMin
,partition
,union) where
import Prelude hiding (null)
import qualified Data.Tree.AVL as AVL
import Data.COrdering
import Data.Maybe
import qualified Data.List as L
data SetBy a = SetBy {
cmpFunc :: a -> a -> COrdering a,
tree :: AVL.AVL a
}
instance Show a => Show (SetBy a) where
show (SetBy _ t) = case AVL.asListL t of
[] -> "empty"
l -> "fromList "++show l
empty cmp = SetBy (fstByCC cmp) AVL.empty
fromList cmp l = fromAscList cmp (L.sortBy cmp l)
fromAscList = fromAscList' . fstByCC
fromAscList' cmp l = SetBy cmp (AVL.asTreeL l)
null = AVL.isEmpty . tree
toList = toAscList
toAscList (SetBy _ t) = AVL.asListL t
insert e (SetBy cmp t) = SetBy cmp (AVL.push (cmp e) e t)
delete e (SetBy cmp t) = SetBy cmp (fromMaybe t $ fmap snd $ AVL.tryPop (cmp e) t)
member e (SetBy cmp t) = isJust $ AVL.tryRead t (cmp e)
findMin (SetBy _ t) = AVL.assertReadL t
partition p s@(SetBy c t) = (fromAscList' c a,fromAscList' c b)
where ~(a,b) = L.partition p $ toAscList s
union (SetBy c t) (SetBy _ t') = SetBy c (AVL.union c t t')