 		}
 	}
 
+	/// Returns an array of all initial segments of the receiver, shortest first
+	public var inits : List<List<A>> {
+		return self.reduce(List<List<A>>(), combine: { xss, x in
+			return List<List<A>>([], xss.map { List(x, $0) })
+		})
+	}
+	
+	/// Returns an array of all final segments of the receiver, longest first
+	public var tails : List<List<A>> {
+		return self.reduce(List<List<A>>(), combine: { x, y in
+			return List<List<A>>.pure(List(y, x.head()!)) + x
+		})
+	}
+
 	/// Returns whether or not the receiver is the empty list.
-	public func isEmpty() -> Bool {
+	public var isEmpty : Bool {
 		return self.len == 0
 	}
 


	/// Applies a binary operator to reduce the elements of the receiver to a single value.
	public func reduce<B>(f : (B, A) -> B, initial : B) -> B {
		switch self.match() {
		case .Nil:
			return initial
		case let .Cons(x, xs):


	/// Returns a list of elements satisfying a predicate.
	public func filter(p : A -> Bool) -> List<A> {
		switch self.match {
		case .Nil:
			return []
		case let .Cons(x, xs):
