 	}
 }
 
-struct Fun<A, C> {
+struct Fun<A : protocol<Arbitrary, CoArbitrary>, C : Arbitrary> {
 	let p : FunProxy<A, Any, C>
 
 

}

/// Generates a Swift function from T to U.
public struct ArrowOf<T : CoArbitrary, U : Arbitrary> : Arbitrary, Printable {
	public let getArrow : T -> U

	public init(_ arr : (T -> U)) {
		self.getArrow = arr
	}

	public var description : String {
		return "\(self.getArrow)"
	}

	private static func create(arr : (T -> U)) -> ArrowOf<T, U> {
		return ArrowOf(arr)
	}

	public static func arbitrary() -> Gen<ArrowOf<T, U>> {
		return promote({ T.coarbitrary($0)(U.arbitrary()) }).fmap { ArrowOf($0) }
	}

	public static func shrink(bl : ArrowOf<T, U>) -> [ArrowOf<T, U>] {

//  Copyright (c) 2015 Robert Widmann. All rights reserved.
//

internal class FunProxy<A : protocol<Arbitrary, CoArbitrary>, B, C : Arbitrary> { }

internal class Pair<A, B, C> : FunProxy<A, B, C> {
	typealias FunType = Fun<(A, B), C>
