definition module StrictList

from StdClass import class ==

// Strict lists consume less space than normal lists

:: StrictList a
	= SCons !a (StrictList a)
	| SNil

instance == (StrictList a) | == a

slAppend	:: !(StrictList .a) !u:(StrictList .a) -> u:StrictList .a
slReverse	:: !(StrictList a) -> StrictList a
slSplitAt	:: !Int u:(StrictList .a) -> (StrictList .a, u:StrictList .a)
slFromList	:: ![a] -> StrictList a
slMap		:: !(a -> b) !(StrictList a) -> StrictList b
slLength	:: !(StrictList a) -> Int
slHead		:: !(StrictList a) -> a
slTail		:: !(StrictList a) -> (StrictList a)
slToList	:: !(StrictList a) -> [a]
slIndex		:: !Int !(StrictList .a) -> .a
slIsEmpty	:: !(StrictList a) -> Bool
slTake		:: !Int !(StrictList a) -> StrictList a
slDrop		:: !Int !(StrictList a) -> StrictList a
slLast		:: !(StrictList a) -> a
slInit		:: !(StrictList a) -> StrictList a
slUpdate	:: !Int !.a !u:(StrictList .a) -> u:StrictList .a

// slAppend:	Appends two strict lists
// slReverse:	Reverses a strict list
// slSplitAt:	Splits a strict list at the indicated position
// slFromList:	Converts a normal list to a strict list
// slMap:		Maps a function over a strict list
// slLength:	Computes the length of a strict list
// slHead:		Returns the head of the list
// slTail:		Returns the tail of the list
// slToList:	Converts a strict list to a normal list
// slIndex:		Returns the element at the given position
// slIsEmpty:	Returns whether the list is empty or not
// slTake:		Returns a number of elements from the beginning
// slDrop:		Removes a number of elements from the beginning
// slLast:		Return the last element
// slInit:		Returns all but the last element