{-# OPTIONS_HADDOCK ignore-exports #-} module MyPrelude where import Control.Arrow ((***)) import Data.List -- |Used to create a common interface for default settings of data types. class Def a where def :: a -- |For negating random types. class Not b where not' :: b -> b -- |Split an array into subarrays depending on a given condition. splitBy :: (a -> Bool) -- ^ condition -> [a] -- ^ array to split -> [[a]] -- ^ splitted array splitBy f s = case dropWhile f s of [] -> [] s' -> w : splitBy f s'' where (w, s'') = break f s' -- |Remove a given item from a list. removeItem :: (Eq a) => a -> [a] -> [a] removeItem x = foldr (\x' y -> if x' == x then y else x':y) [] -- |Sort a list of tuples lexicographically. sortLex :: (Ord a) => [(a, a)] -> [(a, a)] sortLex = sortBy (\(x1, y1) (x2, y2) -> case compare x1 x2 of EQ -> compare y1 y2 x -> x) -- |Sort a list of tuples lexicographically, but start with second elem. sortLexSwapped :: (Ord a) => [(a, a)] -> [(a, a)] sortLexSwapped = sortBy (\(x1, y1) (x2, y2) -> case compare y1 y2 of EQ -> compare x1 x2 y -> y) -- |Get the last x elements of a list. getLastX :: Int -> [a] -> [a] getLastX a xs | length xs < a = [] | otherwise = snd . splitAt (length xs - a) $ xs -- |Get a list with it's head and last element cut. If there are less -- than 3 elements in the list, return an empty list. tailInit :: [a] -> [a] tailInit xs | length xs > 2 = tail . init $ xs | otherwise = [] -- |Remove duplicates from a list. rmdups :: (Ord a) => [a] -> [a] rmdups = foldl (\seen x -> if x `elem` seen then seen else seen ++ [x]) [] -- |Apply a function to the first element of a tuple. first :: (a -> b) -> (a,c) -> (b,c) first = (*** id) -- |Sequentialize a list, such as: -- [1, 2, 3, 4, 5] -> [[1],[1,2],[1,2,3],[1,2,3,4],[1,2,3,4,5]] seqList :: [a] -> [[a]] seqList = tail. inits -- |Duplicate the last element of a list and append it. dupLast :: [a] -> [a] dupLast [] = [] dupLast xs = xs ++ [last xs] -- |Simpler version of if-then-else. if' :: Bool -> a -> a -> a if' True x _ = x if' False _ y = y -- |Shift a list k places. shiftM :: Int -> [a] -> [a] shiftM _ [] = [] shiftM 0 xs = xs shiftM n xs = drop n xs ++ take n xs -- |Shift a list. -- E.g.: shiftM' (== 5) shiftM' :: Eq a => a -> [a] -> [a] shiftM' s xs = dropWhile (/= s) xs ++ takeWhile (/= s) xs -- |Get the pivot of a list. pivot :: [a] -> Maybe a pivot [] = Nothing pivot xs = Just . (!!) xs . flip div 2 . length $ xs