module Sound.SC3.Lang.Collection.Collection where
import Data.List
import Data.Maybe
fill :: Int -> (Int -> a) -> [a]
fill n f = map f [0 .. n 1]
size :: [a] -> Int
size = length
isEmpty :: [a] -> Bool
isEmpty = null
ignoringIndex :: (a -> b) -> a -> Int -> b
ignoringIndex f e _ = f e
collect :: (a -> Int -> b) -> [a] -> [b]
collect f l = zipWith f l [0..]
select :: (a -> Int -> Bool) -> [a] -> [a]
select f l = map fst (filter (uncurry f) (zip l [0..]))
reject :: (a -> Int -> Bool) -> [a] -> [a]
reject f l = map fst (filter (not . uncurry f) (zip l [0..]))
detect :: (a -> Int -> Bool) -> [a] -> Maybe a
detect f l = maybe Nothing (Just . fst) (find (uncurry f) (zip l [0..]))
detectIndex :: (a -> Int -> Bool) -> [a] -> Maybe Int
detectIndex f l = maybe Nothing (Just . snd) (find (uncurry f) (zip l [0..]))
inject :: a -> (a -> b -> a) -> [b] -> a
inject i f = foldl f i
any' :: (a -> Int -> Bool) -> [a] -> Bool
any' f = isJust . detect f
every :: (a -> Int -> Bool) -> [a] -> Bool
every f = let g e = not . f e
in not . any' g
count :: (a -> Int -> Bool) -> [a] -> Int
count f = length . select f
occurencesOf :: (Eq a) => a -> [a] -> Int
occurencesOf k = count (\e _ -> e == k)
sum' :: (Num a) => (b -> Int -> a) -> [b] -> a
sum' f = sum . collect f
maxItem :: (Ord b) => (a -> Int -> b) -> [a] -> b
maxItem f = maximum . collect f
minItem :: (Ord b) => (a -> Int -> b) -> [a] -> b
minItem f = minimum . collect f