matterhorn-40901.0.0: src/Util.hs
module Util
( nubOn
)
where
import Prelude ()
import Prelude.MH
import qualified Data.Set as Set
-- | The 'nubOn' function removes duplicate elements from a list. In
-- particular, it keeps only the /last/ occurrence of each
-- element. The equality of two elements in a call to @nub f@ is
-- determined using @f x == f y@, and the resulting elements must have
-- an 'Ord' instance in order to make this function more efficient.
nubOn :: (Ord b) => (a -> b) -> [a] -> [a]
nubOn f = snd . go Set.empty
where go before [] = (before, [])
go before (x:xs) =
let (before', xs') = go before xs
key = f x in
if key `Set.member` before'
then (before', xs')
else (Set.insert key before', x : xs')