 //  Copyright (c) 2015 Rob Rix. All rights reserved.
 
-public enum Constructor<T: Hashable>: Hashable, Printable {
+public enum Constructor<T>: Printable {
 	case Unit
 	case Function(Box<T>, Box<T>)
 	case Sum(Box<T>, Box<T>)

	}


	// MARK: Hashable

	public var hashValue: Int {
		let hash: Int -> (T, T) -> Int = { n in { n ^ $0.hashValue ^ $1.hashValue } }
		return analysis(
			ifUnit: 0,
			ifFunction: hash(1),
			ifSum: hash(2))
	}


	// MARK: Printable

	public var description: String {

	return left.0 == right.0 && left.1 == right.1
}

public func == <T: Equatable> (left: Constructor<T>, right: Constructor<T>) -> Bool {
	return
		(left.isUnit && right.isUnit)
	||	(left.isBool && right.isBool)
