var array = {}


array.range = function ( from, to, step ) {
	var step = step || 1
	var retv = []
	var i

	for ( i = from; i <= to; ++i )
		Array.push(retv, i)

	return retv
}

array.slice = function ( obj, from, to ) {
	var retv = []

	for ( var i = from ; i <= to ; ++i )
		Array.push(retv, obj[i])

	return retv
}

array.map = function ( obj, func, args ) {
	var retv = {}

	for ( var k in obj )
		retv[k] = func(obj[k], k, obj, args)

	return retv
}

array.filter = function ( obj, func, args ) {
	var retv = {}

	for ( var k in obj )
		if ( func(obj[k], k, obj, args) )
			retv[k] = obj[k]

	return retv
}

array.merge = function () {
	var retv = {}

	for ( var i in arguments )
		for ( var k in arguments[i] )
			retv[k] = arguments[i][k]

	return retv
}

array.join = function () {
	var retv = {}

	for ( var i in arguments )
		for ( var k in arguments[i] )
			Array.push(retv, arguments[i][k])

	return retv
}

array.foldr = function ( obj, func, args ) {
	var retv = null

	for ( var k in obj )
		retv	= retv == null
			? obj[k]
			: func(retv, obj[k], args)

	return retv
}

array.flatten = function ( obj ) {
	var retv = []

	for ( var k1 in obj )
		for ( var k2 in obj[k1] )
			Array.push(retv, obj[k1][k2])

	return retv
}

array.all = function ( obj, func, args ) {
	for ( var k in obj )
		if ( ! func(obj[k], k, obj, args) )
			return false

	return true
}

array.any = function ( obj, func, args ) {
	for ( var k in obj )
		if ( func(obj[k], k, obj, args) )
			return true

	return false
}

array.length = function ( obj ) {
	if ( typeof obj.length != 'undefined' )
		return obj.length

	var n = 0
	for ( var k in obj )
		++n

	return n
}

array.head = function ( obj ) {
	return array.slice(obj, 0, 0)[0]
}

array.tail = function ( obj ) {
	return array.slice(obj, 1, array.length(obj)-1)
}

array.filter.gt = function ( x ) { return function(y) { return y> x } }
array.filter.ge = function ( x ) { return function(y) { return y>=x } }
array.filter.lt = function ( x ) { return function(y) { return y< x } }
array.filter.le = function ( x ) { return function(y) { return y>=x } }
array.filter.eq = function ( x ) { return function(y) { return y==x } }
array.filter.ne = function ( x ) { return function(y) { return y!=x } }

