Skip to content

Instantly share code, notes, and snippets.

@Danappelxx
Last active December 31, 2015 14:14
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Danappelxx/2e74c3d41bf0ceb4ae2c to your computer and use it in GitHub Desktop.
Save Danappelxx/2e74c3d41bf0ceb4ae2c to your computer and use it in GitHub Desktop.
struct Request {}
struct Response {}
enum MiddlewareBeforeResult {
case Next(Request)
case Respond(Response)
}
typealias MiddlewareBefore = Request -> MiddlewareBeforeResult
typealias MiddlewareAfter = (Request, Response) -> Response
typealias Responder = Request -> Response
infix operator >>> {
associativity left
}
func >>>(middlewareA: MiddlewareBefore, middlewareB: MiddlewareBefore) -> MiddlewareBefore {
return { req in
switch middlewareA(req) {
case .Next(let req):
return middlewareB(req)
case .Respond(let res):
return .Respond(res)
}
}
}
func >>>(middleware: MiddlewareBefore, responder: Responder) -> Responder {
return { req in
switch middleware(req) {
case .Next(let req):
return responder(req)
case .Respond(let res):
return res
}
}
}
func >>>(responder: Responder, middleware: MiddlewareAfter) -> Responder {
return { req in
let res = responder(req)
return middleware(req, res)
}
}
let before1: MiddlewareBefore = { req in
print("before1")
return .Next(req)
}
let before2: MiddlewareBefore = { req in
print("before2")
return .Next(req)
}
let respond: Responder = { req in
print("responder")
return Response()
}
let after1: MiddlewareAfter = { req, res in
print("after1")
return res
}
let after2: MiddlewareAfter = { req, res in
print("after2")
return res
}
let route = before1 >>> before2 >>> respond >>> after1 >>> after2
route(Request())
// prints:
//before1
//before2
//responder
//after1
//after2
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment