package scalaz
package http
package servlet
import response.Response
import request.Request
abstract class ServletApplication[IN[_], OUT[_]](implicit i: InputStreamer[IN], e: Each[OUT]) {
def application(implicit servlet: HttpServlet, servletRequest: HttpServletRequest, request: Request[IN]) : Response[OUT]
def application(implicit servlet: HttpServlet, servletRequest: HttpServletRequest) : Application[IN, OUT] = new Application[IN, OUT] {
def apply(implicit request: Request[IN]) = application(servlet, servletRequest, request)
}
def apply(servlet: HttpServlet, servletRequest: HttpServletRequest, req: Request[IN]) = application(servlet, servletRequest)(req)
val inputStreamer = i
val each = e
}
object ServletApplication {
def servletApplication[IN[_], OUT[_]](f: (HttpServlet, HttpServletRequest, Request[IN]) => Response[OUT])(implicit i: InputStreamer[IN], e: Each[OUT]) =
new ServletApplication[IN, OUT] {
def application(implicit servlet: HttpServlet, servletRequest: HttpServletRequest, request: Request[IN]) = f(servlet, servletRequest, request)
}
def servletApplication_[IN[_], OUT[_]](f: (HttpServlet, HttpServletRequest) => Application[IN, OUT])(implicit i: InputStreamer[IN], e: Each[OUT]) =
new ServletApplication[IN, OUT] {
def application(implicit servlet: HttpServlet, servletRequest: HttpServletRequest, request: Request[IN]) = f(servlet, servletRequest)(request)
}
def servletApplication__[IN[_], OUT[_]](f: (HttpServlet) => Application[IN, OUT])(implicit i: InputStreamer[IN], e: Each[OUT]) =
servletApplication_[IN, OUT]((s, r) => f(s))
def servletApplication___[IN[_], OUT[_]](f: (HttpServletRequest) => Application[IN, OUT])(implicit i: InputStreamer[IN], e: Each[OUT]) =
servletApplication_[IN, OUT]((s, r) => f(r))
def application[IN[_], OUT[_]](a: Application[IN, OUT])(implicit i: InputStreamer[IN], e: Each[OUT]) =
servletApplication_[IN, OUT]((s, r) => a)
}