Skip to content

Instantly share code, notes, and snippets.

@gfontenot
Created February 5, 2015 19:25
Show Gist options
  • Save gfontenot/d070469dba4569d93535 to your computer and use it in GitHub Desktop.
Save gfontenot/d070469dba4569d93535 to your computer and use it in GitHub Desktop.
import Foundation
infix operator >>- { associativity left precedence 150 }
public func >>-<T, U>(a: T?, f: T -> U?) -> U? {
return a.flatMap(f)
}
extension Optional {
func flatMap<U>(f: T -> U?) -> U? {
switch self {
case let .Some(x): return f(x)
default: return .None
}
}
}
protocol RequestType { }
struct Request<T: RequestType> {
let request: NSMutableURLRequest
}
struct GET: RequestType { }
struct POST: RequestType { }
struct Authenticated: RequestType { }
struct Payload: RequestType { }
func addPayload<T: RequestType>(json: AnyObject)(request: Request<T>) -> Request<Payload>? {
let req = request.request
req.setValue("application/json", forHTTPHeaderField: "Content-Type")
req.HTTPBody = NSJSONSerialization.dataWithJSONObject(json, options: NSJSONWritingOptions(0), error: nil)
return Request(request: req)
}
func postRequest(request: Request<GET>) -> Request<POST>? {
let req = request.request
req.HTTPMethod = "POST"
return Request(request: req)
}
func authenticateRequest<T: RequestType>(request: Request<T>) -> Request<Authenticated>? {
if let token = getToken() {
let req = request.request
req.setValue("Token token=\(token)", forHTTPHeaderField: "Authorization")
return Request(request: req)
}
return .None
}
func getToken() -> String? {
return "foo"
}
func mutableRequestForPath(path: String) -> Request<GET>? {
let url = NSURL(string: path)
if let request = url.map({ NSMutableURLRequest(URL: $0) }) {
request.setValue("application/vnd.circus+json; version=foobar", forHTTPHeaderField: "Accept")
request.setValue("gzip;q=1.0,compress;q=0.5", forHTTPHeaderField: "Accept-Encoding")
return Request(request: request)
}
return .None
}
let request = mutableRequestForPath("foo") >>- postRequest >>- addPayload([]) >>- authenticateRequest
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment