diff --git a/src/Stream.hs b/src/Stream.hs index be6b61c..6fa2b36 100644 --- a/src/Stream.hs +++ b/src/Stream.hs @@ -18,6 +18,18 @@ fromList (pair:pairs) = Stream [(pair, fromList pairs)] infinite :: a -> Stream a infinite a = Stream [(a, infinite a)] +merge :: Eq a => Stream a -> Stream a -> Stream a +merge (Stream aPairs) (Stream bPairs) = Stream $ foldl mergeOrAdd aPairs bPairs + where + openAt _ l [] = (l, []) + openAt p up l@(x:xs) = if p x then (up, l) else openAt p (x:up) xs + zipUp ([], l) = l + zipUp (x:xs, l) = zipUp (xs, x:l) + mergeOrAdd accumulator (b, bStream) = zipUp $ + case openAt ((== b) . fst) [] accumulator of + (up, []) -> (up, [(b, bStream)]) + (up, (x, xStream):down) -> (up, (x, merge xStream bStream):down) + showTree :: Show a => Stream a -> String showTree = intercalate "\n" . getLines where