{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE ScopedTypeVariables #-}
module Utils where
import Data.Char
import Data.Set
nubOrd :: forall a . Ord a => [a] -> [a]
nubOrd = inner empty
where
inner :: Set a -> [a] -> [a]
inner acc (a : r)
| a `member` acc = inner acc r
| otherwise = a : inner (insert a acc) r
inner _ [] = []
errorNyi :: String -> a
errorNyi message = error $ stripSpaces $ unlines $
"Encountered a language construct that is" :
"not yet implemented. Please consider opening a bug report about" :
"this here: https://github.com/soenkehahn/dead-code-detection/issues" :
"" :
"Here's some debugging output that will probably help to solve this problem:" :
message :
[]
stripSpaces :: String -> String
stripSpaces =
reverse . dropWhile isSpace .
reverse . dropWhile isSpace
mapLeft :: (a -> b) -> Either a c -> Either b c
mapLeft f = \ case
Left a -> Left $ f a
Right x -> Right x