slot0 = {
	funcs = {},
	__index = slot0
}

function slot0.__call(slot0, slot1)
	return uv0:new(slot1)
end

function slot0.new(slot0, slot1, slot2)
	return setmetatable({
		_val = slot1,
		chained = slot2 or false
	}, slot0)
end

function slot0.iter(slot0)
	if type(slot0) == "function" then
		return slot0
	end

	return coroutine.wrap(function ()
		for slot3 = 1, #uv0 do
			coroutine.yield(uv0[slot3])
		end
	end)
end

function slot0.range(slot0, slot1, slot2)
	if slot1 == nil then
		slot1 = slot0
		slot0 = 1
	end

	slot2 = slot2 or 1

	return uv0:new(coroutine.wrap(function ()
		for slot3 = uv0, uv1, uv2 do
			coroutine.yield(slot3)
		end
	end))
end

function slot0.identity(slot0)
	return slot0
end

function slot0.chain(slot0)
	slot0.chained = true

	return slot0
end

function slot0.value(slot0)
	return slot0._val
end

function slot0.funcs.each(slot0, slot1)
	for slot5 in uv0.iter(slot0) do
		slot1(slot5)
	end

	return slot0
end

function slot0.funcs.map(slot0, slot1)
	slot2 = {}

	for slot6 in uv0.iter(slot0) do
		slot2[#slot2 + 1] = slot1(slot6)
	end

	return slot2
end

function slot0.funcs.reduce(slot0, slot1, slot2)
	for slot6 in uv0.iter(slot0) do
		slot1 = slot2(slot1, slot6)
	end

	return slot1
end

function slot0.funcs.detect(slot0, slot1)
	for slot5 in uv0.iter(slot0) do
		if slot1(slot5) then
			return slot5
		end
	end

	return nil
end

function slot0.funcs.select(slot0, slot1)
	slot2 = {}

	for slot6 in uv0.iter(slot0) do
		if slot1(slot6) then
			slot2[#slot2 + 1] = slot6
		end
	end

	return slot2
end

function slot0.funcs.reject(slot0, slot1)
	slot2 = {}

	for slot6 in uv0.iter(slot0) do
		if not slot1(slot6) then
			slot2[#slot2 + 1] = slot6
		end
	end

	return slot2
end

function slot0.funcs.all(slot0, slot1)
	for slot5 in uv0.iter(slot0) do
		if not slot1 or uv0.identity(slot5) then
			return false
		end
	end

	return true
end

function slot0.funcs.any(slot0, slot1)
	for slot5 in uv0.iter(slot0) do
		if slot1 or uv0.identity(slot5) then
			return true
		end
	end

	return false
end

function slot0.funcs.include(slot0, slot1)
	for slot5 in uv0.iter(slot0) do
		if slot5 == slot1 then
			return true
		end
	end

	return false
end

function slot0.funcs.invoke(slot0, slot1, ...)
	slot2 = {
		len = select("#", ...),
		...
	}

	uv0.funcs.each(slot0, function (slot0)
		slot0[uv0](slot0, unpack(uv1, 1, uv1.len))
	end)

	return slot0
end

function slot0.funcs.pluck(slot0, slot1)
	return uv0.funcs.map(slot0, function (slot0)
		return slot0[uv0]
	end)
end

function slot0.funcs.min(slot0, slot1)
	slot1 = slot1 or uv0.identity

	return uv0.funcs.reduce(slot0, {}, function (slot0, slot1)
		if slot0.item == nil then
			slot0.item = slot1
			slot0.value = uv0(slot1)
		elseif uv0(slot1) < slot0.value then
			slot0.item = slot1
			slot0.value = slot2
		end

		return slot0
	end).item
end

function slot0.funcs.max(slot0, slot1)
	slot1 = slot1 or uv0.identity

	return uv0.funcs.reduce(slot0, {}, function (slot0, slot1)
		if slot0.item == nil then
			slot0.item = slot1
			slot0.value = uv0(slot1)
		elseif slot0.value < uv0(slot1) then
			slot0.item = slot1
			slot0.value = slot2
		end

		return slot0
	end).item
end

function slot0.funcs.to_array(slot0)
	slot1 = {}

	for slot5 in uv0.iter(slot0) do
		slot1[#slot1 + 1] = slot5
	end

	return slot1
end

function slot0.funcs.reverse(slot0)
	slot1 = {}

	for slot5 in uv0.iter(slot0) do
		table.insert(slot1, 1, slot5)
	end

	return slot1
end

function slot0.funcs.sort(slot0, slot1)
	slot2 = slot0

	if type(slot0) == "function" then
		slot2 = uv0.funcs.to_array(slot0)
	end

	table.sort(slot2, slot1)

	return slot2
end

function slot0.funcs.first(slot0, slot1)
	if slot1 == nil then
		return slot0[1]
	else
		for slot6 = 1, math.min(slot1, #slot0) do
		end

		return {
			[slot6] = slot0[slot6]
		}
	end
end

function slot0.funcs.rest(slot0, slot1)
	slot2 = {}

	for slot6 = slot1 or 2, #slot0 do
		slot2[#slot2 + 1] = slot0[slot6]
	end

	return slot2
end

function slot0.funcs.slice(slot0, slot1, slot2)
	slot3 = {}
	slot1 = math.max(slot1, 1)

	for slot8 = slot1, math.min(slot1 + slot2 - 1, #slot0) do
		slot3[#slot3 + 1] = slot0[slot8]
	end

	return slot3
end

function slot0.funcs.flatten(slot0)
	slot1 = {}

	for slot5 in uv0.iter(slot0) do
		if type(slot5) == "table" then
			uv0.funcs.each(uv0.funcs.flatten(slot5), function (slot0)
				uv0[#uv0 + 1] = slot0
			end)
		else
			slot1[#slot1 + 1] = slot5
		end
	end

	return slot1
end

function slot0.funcs.push(slot0, slot1)
	table.insert(slot0, slot1)

	return slot0
end

function slot0.funcs.pop(slot0)
	return table.remove(slot0)
end

function slot0.funcs.shift(slot0)
	return table.remove(slot0, 1)
end

function slot0.funcs.unshift(slot0, slot1)
	table.insert(slot0, 1, slot1)

	return slot0
end

function slot0.funcs.join(slot0, slot1)
	return table.concat(slot0, slot1)
end

function slot0.funcs.keys(slot0)
	slot1 = {}

	for slot5, slot6 in pairs(slot0) do
		slot1[#slot1 + 1] = slot5
	end

	return slot1
end

function slot0.funcs.values(slot0)
	slot1 = {}

	for slot5, slot6 in pairs(slot0) do
		slot1[#slot1 + 1] = slot6
	end

	return slot1
end

function slot0.funcs.extend(slot0, slot1)
	for slot5, slot6 in pairs(slot1) do
		slot0[slot5] = slot6
	end

	return slot0
end

function slot0.funcs.is_empty(slot0)
	return next(slot0) == nil
end

function slot0.funcs.is_equal(slot0, slot1, slot2)
	if type(slot0) ~= type(slot1) then
		return false
	end

	if slot3 ~= "table" then
		return slot0 == slot1
	end

	slot5 = getmetatable(slot0)

	if not slot2 and slot5 and slot5.__eq then
		return slot0 == slot1
	end

	for slot10, slot11 in pairs(slot0) do
		if slot1[slot10] == nil or not uv0.funcs.is_equal(slot11, slot12, slot2) then
			return false
		end
	end

	for slot10, slot11 in pairs(slot1) do
		if slot0[slot10] == nil then
			return false
		end
	end

	return true
end

function slot0.funcs.compose(...)
	function slot0(slot0, ...)
		if #slot0 > 1 then
			return slot0[1](uv0(_.rest(slot0), ...))
		else
			return slot0[1](...)
		end
	end

	slot1 = {
		...
	}

	return function (...)
		return uv0(uv1, ...)
	end
end

function slot0.funcs.wrap(slot0, slot1)
	return function (...)
		return uv0(uv1, ...)
	end
end

function slot0.funcs.curry(slot0, slot1)
	return function (...)
		return uv0(uv1, ...)
	end
end

function slot0.functions()
	return uv0.keys(uv0.funcs)
end

slot0.methods = slot0.functions
slot0.funcs.for_each = slot0.funcs.each
slot0.funcs.collect = slot0.funcs.map
slot0.funcs.inject = slot0.funcs.reduce
slot0.funcs.foldl = slot0.funcs.reduce
slot0.funcs.filter = slot0.funcs.select
slot0.funcs.every = slot0.funcs.all
slot0.funcs.some = slot0.funcs.any
slot0.funcs.head = slot0.funcs.first
slot0.funcs.tail = slot0.funcs.rest
slot0.funcs.contains = slot0.funcs.include

function ()
	function slot0(slot0)
		slot1 = false

		if getmetatable(slot0) == uv0 then
			slot1 = slot0.chained
			slot0 = slot0._val
		end

		return slot0, slot1
	end

	function slot1(slot0, slot1)
		if slot1 then
			slot0 = uv0:new(slot0, true)
		end

		return slot0
	end

	for slot5, slot6 in pairs(uv0.funcs) do
		uv0[slot5] = function (slot0, ...)
			slot1, slot2 = uv0(slot0)

			return uv1(uv2(slot1, ...), slot2)
		end
	end
end()

return slot0:new()
