/* import "Prelude" import "IterN" type family El a class Collection a where size :: a -> Integer isEmpty :: a -> Boolean iter :: (El a -> dummy) -> a -> () any :: (El a -> Boolean) -> a -> Boolean all :: (El a -> Boolean) -> a -> Boolean filter :: (El a -> Boolean) -> a -> a partition :: (El a -> Boolean) -> a -> (a,a) groupBy :: (El a -> b) -> [(b, a)] uniqueElement :: a -> El a // may fail fromList :: [El a] -> a toList :: a -> [El a] @inline for :: a -> (El a -> dummy) -> () for c f = iter f c class (Collection a) => Sequence a where // required (!) :: a -> Integer -> El a sub :: a -> Integer -> Integer -> a // optional length :: a -> Integer take :: Integer -> a -> a drop :: Integer -> a -> a mapFirst :: (El a -> Maybe b) -> a -> Maybe b foldl :: (b -> El a -> b) -> b -> a -> b foldr :: (El a -> b -> b) -> b -> a -> b foldl1 :: (El a -> El a -> El a) -> a -> a foldr1 :: (El a -> El a -> El a) -> a -> a elem :: El a -> a -> Boolean elemIndex :: El a -> a -> Maybe Integer elemIndices :: El a -> a -> [Integer] find :: (El a -> Boolean) -> a -> Maybe (El a) findIndex :: (El a -> Boolean) -> a -> Maybe Integer findIndices :: (El a -> Boolean) -> a -> [Integer] mapS :: (El a -> El a) -> a -> a singleton :: El a -> a head :: a -> El a tail :: a -> a safeHead :: a -> Maybe (El a) safeTail :: a -> Maybe a reverse :: a -> a sort :: Ord (El a) => a -> a sortBy :: Ord b => (El a -> b) -> a -> a mapN :: (Integer -> El a) -> Integer -> a mapG :: Sequence b => (El b -> El a) -> b -> a length l = size l isEmpty c = length c == 0 take n c = sub c 0 n drop n c = sub c n (length c) iter f c = iterN (f . (c !)) (length c) any f c = anyN (f . (c !)) (length c) all f c = allN (f . (c !)) (length c) mapFirst f c = mapFirstN (f . (c !)) (length c) class (forall a. Sequence f a, Functor f) => GenericSequence f where concatMap :: (a -> f b) -> f a -> f b map :: (a -> b) -> f a -> f b mapMaybe :: (a -> Maybe b) -> f a -> f b class Set a where union :: a -> a -> a intersection :: a -> a -> a type family Key a type family Value a class Map a where */