/// One of my favorite indian spices. func curry(f: (A, B) -> C) -> A -> B -> C { return { a in { b in f(a, b) } } } // MARK: - Optional func <^> (@noescape f: T -> U, a: T?) -> U? { return a.map(f) } func <*> (f: (T -> U)?, a: T?) -> U? { return a.apply(f) } func >>- (a: T?, @noescape f: T -> U?) -> U? { return a.flatMap(f) } func pure(a: T) -> T? { return .Some(a) } extension Optional { func apply(f: (Wrapped -> U)?) -> U? { return f.flatMap { self.map($0) } } } // MARK: - Array public func <^> (f: T -> U, a: [T]) -> [U] { return a.map(f) } public func <*> (fs: [T -> U], a: [T]) -> [U] { return a.apply(fs) } public func >>- (a: [T], f: T -> [U]) -> [U] { return a.flatMap(f) } public func -<< (f: T -> [U], a: [T]) -> [U] { return a.flatMap(f) } public func pure(a: T) -> [T] { return [a] } public extension Array { func apply(fs: [Element -> U]) -> [U] { return fs.flatMap { self.map($0) } } }