-- | Basic utilities module PGF.Utilities where import Data.Set(empty,member,insert) -- | Like 'Data.List.nub', but O(n log n) instead of O(n^2), since it uses a set to lookup previous things. -- The result list is stable (the elements are returned in the order they occur), and lazy. -- Requires that the list elements can be compared by Ord. -- Code ruthlessly taken from nub' :: Ord a => [a] -> [a] nub' = loop empty where loop _ [] = [] loop seen (x : xs) | member x seen = loop seen xs | otherwise = x : loop (insert x seen) xs -- | Replace all occurences of an element by another element. replace :: Eq a => a -> a -> [a] -> [a] replace x y = map (\z -> if z == x then y else z)