module Waterdeep.Util ( mrepeat , deleteAt , on , nubOn , sortOn , countOf ) where import Lens.Family2 import Data.List import Data.Monoid mrepeat :: (Monoid m) => Int -> m -> m mrepeat n m = mconcat $ replicate n m deleteAt :: Int -> [a] -> [a] deleteAt n l = (take n l) ++ (drop (n + 1) l) on :: (b -> b -> c) -> (a -> b) -> (a -> a -> c) (f `on` g) a b = (g a) `f` (g b) nubOn :: Eq b => (a -> b) -> [a] -> [a] nubOn f = nubBy ((==) `on` f) sortOn :: Ord b => (a -> b) -> [a] -> [a] sortOn f = sortBy (compare `on` f) countOf :: Num r => FoldLike (Sum r) a a' b b' -> (b -> Bool) -> a -> r countOf l f = getSum . views l (\b -> if f b then Sum 1 else Sum 0)