// Functions
include "Prelude"

class Collection col where
    length :: col -> Integer

class (Collection col) => Sequence col el | col -> el where
    toList     :: col -> [el]
    fromList   :: [el] -> col
    
    iter       :: (el -> <e> b)       -> col -> <e> ()
    any        :: (el -> <e> Boolean) -> col -> <e> Boolean
    all        :: (el -> <e> Boolean) -> col -> <e> Boolean
    mapFirst   :: (el -> <e> Maybe b) -> col -> <e> Maybe b
    findFirst  :: (el -> <e> Boolean) -> col -> <e> Maybe el
    firstIndex :: (el -> <e> Boolean) -> col -> <e> Integer

/*
    concatMap :: (a -> <e> [b])     -> [a] -> <e> [b]
    map       :: (a -> <e> b)       -> [a] -> <e> [b]
    filter    :: (a -> <e> Boolean) -> [a] -> <e> [b]
    mapMaybe  :: (a -> <e> Maybe b) -> [a] -> <e> [b]
*/

iterN      :: (Integer -> <e> b) -> Integer -> <e> ()
anyN       :: (Integer -> <e> Boolean) -> Integer -> <e> Boolean
allN       :: (Integer -> <e> Boolean) -> Integer -> <e> Boolean
mapFirstN  :: (Integer -> <e> Maybe b) -> Integer -> <e> Maybe b
concatMapN :: (Integer -> <e> [b]) -> Integer -> <e> [b]
mapN       :: (Integer -> <e> b) -> Integer -> <e> [b]
filterN    :: (Integer -> <e> Boolean) -> Integer -> <e> [Integer]
mapMaybeN  :: (Integer -> <e> Maybe b) -> Integer -> <e> [b]

iterVector      :: (a -> <e> b) -> Vector a -> <e> ()
anyVector       :: (a -> <e> Boolean) -> Vector a -> <e> Boolean
allVector       :: (a -> <e> Boolean) -> Vector a -> <e> Boolean
mapFirstVector  :: (a -> <e> Maybe b) -> Vector a -> <e> Maybe b
concatMapVector :: (a -> <e> [b]) -> Vector a -> <e> Vector b
mapVector       :: (a -> <e> b) -> Vector a -> <e> Vector b
filterVector    :: (a -> <e> Boolean) -> Vector a -> <e> Vector b
mapMaybeVector  :: (a -> <e> Maybe b) -> Vector a -> <e> Vector b


// Sequence types
data [a]           // Java: List<a>
data MList a       // mutable, Java: List<a>
data Array a       // Java: a[]
data MArray a      // mutable, Java: a[]
data BoxedArray a  // Java: Object[]
data List a = Nil | Cons a (List a)
type Vector = Array Double

// Set types
data Set a         // immutable set
data MSet a        // Java: Set<a>

// Map types
data Map a b       // immutable map
data MMap a b      // Java: Map<a>

// Advanced
data Stream a
data FingerTree a

// Classes
class (Additive a a a) => Collection a where
    empty :: a
    size :: a -> Integer

class Foldable c v | c -> v where
    foldl :: (a -> v -> a) -> a -> c -> a

class (Collection c) => Indexable c k v | c -> k v where
    keysOf :: c -> [k]
    entriesOf :: c -> [(k,v)]
    valuesOf :: c _> [v]
    (!) :: c -> k -> v

// Instances

instance Indexable [a] Integer a
instance Indexable (Array a) Integer a
instance Indexable (BoxedArray a) Integer a
instance Indexable (List a) Integer a
instance Indexable (Map a b) a b

// ideas:
- sequence
- map
- set