summaryrefslogtreecommitdiff
path: root/src/runtime/haskell/PGF/Utilities.hs
blob: ab1b4e2fe5d39760969d853bb62da2361bf0197f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
-- | 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 <http://hpaste.org/54411>
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)