Create a gist now

Instantly share code, notes, and snippets.

unionAll :: (Ord a) => [[a]] -> [a]
unionAll xs =
let
xs' = filter (not.null) xs -- | filter empty lists, if any
in
if null xs' -- | if nothing is left after filtering
then [] -- | return the empty list
else -- | otherwise
let
next = minimum (map head xs') -- | find the minimum of head elements
-- | they are minimum values in their respective lists
-- | so this is the minimum of every list
xs'' = map (dropWhile (next==)) xs' -- | remove that value from every list
-- | (no need to filter this time, since lists are ordered)
in next : unionAll xs'' -- | recursively call unionAll on xs''
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment