trait HttpRequest { val host: String val path: String } case class Get(host: String, path: String) extends HttpRequest case class Post(host: String, path: String) extends HttpRequest case class Delete(host: String, path: String) extends HttpRequest case class HttpResponse(status: Int, body: String) case class Server(route: PartialFunction[HttpRequest, HttpResponse]) { def handle(request: HttpRequest): HttpResponse = { if (route.isDefinedAt(request)) { route(request) } else { HttpResponse(500, s"unknown request type $request") } } } object Example { def main(args: Array[String]): Unit = { //println(check(Complex(Number(3),Number(4)))) val route1: PartialFunction[HttpRequest, HttpResponse] = { case Get(host, path) => HttpResponse(200, path) case Post("localhost", path) => // upload a file HttpResponse(200, "file uploaded") case Post(_, path) => HttpResponse(403, "forbidden") } val route2: PartialFunction[HttpRequest, HttpResponse] = { case Delete("localhost", _) => HttpResponse(200, "deleted") } val route = route1 orElse route2 val server: Server = Server(route) val requests: List[HttpRequest] = List( Post("localhost", "foo.txt"), Get("localhost", "foo.txt"), Delete("localhost","foo.txt"), Get("localhost", "foo.txt") ) val responses: List[HttpResponse] = requests.map(server.handle(_)) for (response <- responses) { println(response) } } }