Skip to content

Commit

Permalink
composition to the max.
Browse files Browse the repository at this point in the history
  • Loading branch information
mariusae committed Dec 3, 2010
1 parent c75bb1c commit a5d7491
Showing 1 changed file with 14 additions and 8 deletions.
22 changes: 14 additions & 8 deletions src/main/scala/com/twitter/finagle/service/Service.scala
Expand Up @@ -17,16 +17,22 @@ abstract class Service[-Req <: AnyRef, +Rep <: AnyRef] extends (Req => Future[Re
}
}

// A filter is a service transform.
abstract class Filter[Req, Rep, Req1, Rep1]
extends ((Req, Service[Req1, Rep]) => Future[Rep1])
// A filter is a service transform [Req -> (Req1 -> Rep1) -> Rep].
abstract class Filter[-Req <: AnyRef, +Rep <: AnyRef, Req1 <: AnyRef, Rep1 <: AnyRef]
extends ((Req, Service[Req1, Rep1]) => Future[Rep])
{
// def apply(request: Request, service: Service[Req1, Rep]): Future[Rep1]
def apply(request: Req, service: Service[Req1, Rep1]): Future[Rep]

def andThen(next: Filter[Req1, Rep]): Filter[Req, Rep1] =
new Filter[Req, Rep1] {
def apply(request: Req, service: Service[Req1, Rep]) = {
Filter.this.
def andThen[Req2 <: AnyRef, Rep2 <: AnyRef](next: Filter[Req1, Rep1, Req2, Rep2]) =
new Filter[Req, Rep, Req2, Rep2] {
def apply(request: Req, service: Service[Req2, Rep2]) = {
Filter.this.apply(request, new Service[Req1, Rep1] {
def apply(request: Req1): Future[Rep1] = next(request, service)
})
}
}

def andThen(service: Service[Req1, Rep1]) = new Service[Req, Rep] {
def apply(request: Req) = Filter.this.apply(request, service)
}
}

0 comments on commit a5d7491

Please sign in to comment.