 /// `rhs.`
 ///
 /// This is a shortcut to create for example: `object1.top | left | right ~> object2.top | left | right.`
-public func ~> <Value: AnyObject, L: LayoutConstraintType where L.Value == Value>(lhs: Value, rhs: [L]) -> [NSLayoutConstraint] {
+public func ~> <Value1: AnyObject, Value2: AnyObject, L: LayoutConstraintType where L.Value == Value2>(lhs: Value1, rhs: [L]) -> [NSLayoutConstraint] {
     return rhs.map { return LhsLayoutConstraint(lhs, constraint: $0) ~> $0 }
 }
 

/// `rhs.`
///
/// This is a shortcut to create for example: `object1.top | left | right ~> object2.top | left | right.`
public func ~> <Value: AnyObject, L: LayoutConstraintType where L.Value == Value?>(lhs: Value, rhs: [L]) -> [NSLayoutConstraint] {
    return rhs.map { return LhsLayoutConstraint(lhs, constraint: $0) ~> $0 }
}

/// Initializes an **activates** `NSLayoutConstraint` array,
/// applying `~>` for each element in `lhs` to each element in `rhs.`
public func ~> <Value: AnyObject, L: LayoutConstraintType where L.Value == Value>(lhs: [LhsLayoutConstraint<Value>], rhs: [L]) -> [NSLayoutConstraint] {
    precondition(lhs.count == rhs.count)
    
    var constraints = [NSLayoutConstraint]()

///
/// e.g: `object.height ~> 500`
public func ~> <Value: AnyObject>(lhs: LhsLayoutConstraint<Value>, rhs: CGFloat) -> NSLayoutConstraint {
    return lhs ~> RhsLayoutConstraint<Value>(constant: rhs)
}

/// Initializes an **activates** `NSLayoutConstraint` array, where `rhs` values are taken from
/// `lhs.`
///
/// This is a shortcut to create for example: `object1.top | left | right ~> object2.top | left | right.`
public func ~> <Value1: AnyObject, Value2: AnyObject>(lhs: [LhsLayoutConstraint<Value1>], rhs: Value2) -> [NSLayoutConstraint] {
    return lhs.map { return $0 ~> RhsLayoutConstraint(rhs, constraint: $0) }
}

