module Util
where
import Data.Set (Set)
import qualified Data.Set as Set
import qualified Data.Foldable as Foldable
import Data.Map (Map)
import qualified Data.Map as Map
import qualified Data.List as List
deleteAt :: Int -> [a] -> [a]
deleteAt i xs = ys ++ tail zs where
(ys,zs) = splitAt i xs
maybeTuple :: Maybe (a,b) -> (Maybe a, Maybe b)
maybeTuple (Just (a,b)) = (Just a, Just b)
maybeTuple Nothing = (Nothing, Nothing)
compose :: [(a -> a)] -> (a -> a)
compose = foldr (.) id
graph :: (a -> b) -> a -> (a,b)
graph f x = (x, f x)
isNotASubsetOf :: Ord k => Set k -> Set k -> Bool
isNotASubsetOf s s' = not (Set.isSubsetOf s s')
getSubmap :: (Ord k, Foldable f) => Map k a -> f k -> Map k a
getSubmap theMap theKeys = Map.fromList $ graph (theMap Map.!) <$> List.nub (Foldable.toList theKeys)
deleteKeys :: (Ord k, Foldable f) => Map k a -> f k -> Map k a
deleteKeys theMap theKeys = compose (Map.delete <$> List.nub (Foldable.toList theKeys)) theMap
cartesian :: [a] -> [b] -> [(a,b)]
cartesian xs ys = [(x,y) | x <- xs, y <- ys]
exp :: Monoid a => a -> Int -> a
exp x n = mconcat (replicate n x)