31 lines
690 B
Haskell
31 lines
690 B
Haskell
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)
|