 
 /// Produces the concatenation of `left` and `right`.
 public func ++ <T> (left: Stream<T>, right: Stream<T>) -> Stream<T> {
-	return left.uncons().map { first, rest in
+	return left.uncons.map { first, rest in
 		.cons(first, Memo { rest.value ++ right })
 	} ?? right
 }

	///
	/// `combine` should return `.Left(x)` to terminate the fold with `x`, or `.Right(x)` to continue the fold.
	public func foldLeft<Result>(seed: Result, _ combine: (Result, T) -> Either<Result, Result>) -> Result {
		return uncons().map { first, rest in
			combine(seed, first).either(
				ifLeft: id,
				ifRight: { rest.value.foldLeft($0, combine) })

	public func take(n: Int) -> Stream {
		if n <= 0 { return nil }

		return uncons.map { .cons($0, $1.value.take(n - 1)) } ?? nil
	}

	/// Returns a `Stream` without the first `n` elements of `stream`.
