 
 	/// The first element of the receiver, or `nil` if the receiver is the empty stream.
 	public var first: T? {
-		return uncons()?.0
+		return uncons?.0
 	}
 
 	/// The remainder of the receiver after its first element. If the receiver is the empty stream, this will return the empty stream.
 	public var rest: Stream {
-		return uncons()?.1.value ?? nil
+		return uncons?.1.value ?? nil
 	}
 
 	/// Is this the empty stream?
 	public var isEmpty: Bool {
-		return uncons() == nil
+		return uncons == nil
 	}
 
 

	///
	/// `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`.
