// RUN: %target-run-simple-swift | FileCheck %s func curry(f: (T, U) -> V)(_ x: T)(_ y: U) -> V { return f(x, y) } let insult = curry(+)("I'm with stupid ☞ ") println(insult("😡")) // CHECK: I'm with stupid ☞ 😡 let plus1 = curry(+)(1) println(plus1(5)) // CHECK-NEXT: 6 let plus5 = curry(+)(5) println(plus5(5)) // CHECK-NEXT: 10 println(insult("😰")) // CHECK-NEXT: I'm with stupid ☞ 😰 // rdar://problem/18988428 func clamp(minValue: T, _ maxValue: T)(n: T) -> T { return max(minValue, min(n, maxValue)) } let clampFoo2 = clamp(10.0, 30.0) println(clampFoo2(n: 3.0)) // CHECK-NEXT: 10.0 // rdar://problem/19195470 func pair (a: T) -> U -> (T,U) { return { b in (a,b) } } func pair_ (a: T)(b: U) -> (T,U) { return (a,b) } infix operator <+> { } func <+> (lhs: T?, rhs: T -> U -> V) -> U -> V? { if let x = lhs { return { y in .Some(rhs(x)(y)) } } else { return { _ in nil } } } let a : Int? = 23 let b : Int? = 42 println((b <+> pair)(a!)) // CHECK-NEXT: (42, 23) println((b <+> pair_)(a!)) // CHECK-NEXT: (42, 23) // // rdar://problem/20475584 // struct Identity { let value: A } struct Const { let value: A } func fmap(f: A -> B)(_ identity: Identity) -> Identity { return Identity(value: f(identity.value)) } func fmap(f: A -> B)(_ const: Const) -> Const { return const } // really Const() func _Const(a: A) -> Const { return Const(value: a) } func const(a: A)(_: B) -> A { return a } // really Identity() func _Identity(a: A) -> Identity { return Identity(value: a) } func getConst(c: Const) -> A { return c.value } func runIdentity(i: Identity) -> A { return i.value } func view(lens: (A -> Const) -> S -> ((A -> S) -> Const -> Const) -> Const)(_ s: S) -> A { return getConst(lens(_Const)(s)(fmap)) } func over(lens: (A -> Identity) -> S -> ((A -> S) -> Identity -> Identity) -> Identity)(_ f: A -> A)(_ s: S) -> S { return runIdentity(lens({ _Identity(f($0)) })(s)(fmap)) } func set(lens: (A -> Identity) -> S -> ((A -> S) -> Identity -> Identity) -> Identity)(_ x: A)(_ y: S) -> S { return over(lens)(const(x))(y) } func _1(f: A -> C)(_ x: A, _ y: B)(_ fmap: (A -> (A, B)) -> C -> D) -> D { return fmap({ ($0, y) })(f(x)) } func _2(f: B -> C)(_ x: A, _ y: B)(_ fmap: (B -> (A, B)) -> C -> D) -> D { return fmap({ (x, $0) })(f(y)) } public func >>> (f: T -> U, g: U -> V) -> T -> V { return { g(f($0)) } } public func <<< (f: U -> V, g: T -> U) -> T -> V { return { f(g($0)) } } infix operator >>> { associativity right precedence 170 } infix operator <<< { associativity right precedence 170 } println(view(_1)((1, 2))) // CHECK-NEXT: 1 println(over(_1)({ $0 * 4 })((1, 2))) // CHECK-NEXT: (4, 2) println(set(_1)(3)((1, 2))) // CHECK-NEXT: (3, 2) println(view(_2)("hello", 5)) // CHECK-NEXT: 5