module Util.List where

import Data.List

-- TODO: speed up
-- | Returns true iff the list has no duplicates.
noDups :: Eq a => [a] -> Bool
noDups xs = nub xs == xs

-- | Replaces the last item in a list. Assumes the list is non empty.
replaceLast :: [a] -> a -> [a]
replaceLast [_] v = [v]
replaceLast (x:xs) v = x : replaceLast xs v
replaceLast _ _ = error "Unsupported call to replaceLast"

cartesianProduct :: [[a]] -> [[a]]
cartesianProduct vss = sequence vss