diff --git a/src/Data/SumBag.hs b/src/Data/SumBag.hs index 99fd760daea1133d67d9a5e215dcc3d25ec5916a..f118c8c0aeafe6924989e65f14ba2078a17112c8 100644 --- a/src/Data/SumBag.hs +++ b/src/Data/SumBag.hs @@ -8,6 +8,8 @@ module Data.SumBag , insert , delete , elem + , toAscList + , fromList ) where import Prelude hiding (sum, min, elem) @@ -79,6 +81,17 @@ delete a (Node _ e left right) let (min, rest) = delmin right in balance1 min left rest +toAscList :: Ord a => SumBag a -> [a] +toAscList bag = helper bag [] + where helper Leaf accu = accu + helper (Node _ e left right) accu = + helper left (mkList e ++ helper right accu) + + mkList (Element val mult) = map (const val) (NE.toList mult) + +fromList :: (Ord a, Monoid a) => [a] -> SumBag a +fromList = foldr insert empty + -- Internal functions -- | "Smart" constructor for Node. Will compute the meta data from its subtrees