diff --git a/core/src/main/scala/routing/extractor/PathExtractor.scala b/core/src/main/scala/routing/extractor/PathExtractor.scala index 741967d..70b4733 100644 --- a/core/src/main/scala/routing/extractor/PathExtractor.scala +++ b/core/src/main/scala/routing/extractor/PathExtractor.scala @@ -4,12 +4,26 @@ package extractor import java.util.UUID import scala.util.Try -trait PathExtractor[A] { +trait PathExtractor[A] { self => def extract(path: String): Option[A] + + final def mapO[B](f: A => Option[B]): PathExtractor[B] = + new PathExtractor[B] { + def extract(path: String): Option[B] = self.extract(path).flatMap(f) + } + + final def map[B](f: A => B): PathExtractor[B] = mapO(a => Some(f(a))) } -trait RestOfPathExtractor[A] { +trait RestOfPathExtractor[A] { self => def extract(path: String): Option[A] + + final def mapO[B](f: A => Option[B]): RestOfPathExtractor[B] = + new RestOfPathExtractor[B] { + def extract(path: String): Option[B] = self.extract(path).flatMap(f) + } + + final def map[B](f: A => B): RestOfPathExtractor[B] = mapO(a => Some(f(a))) } object PathExtractor { diff --git a/core/src/main/scala/routing/extractor/QueryExtractor.scala b/core/src/main/scala/routing/extractor/QueryExtractor.scala index 4be1035..7404bbe 100644 --- a/core/src/main/scala/routing/extractor/QueryExtractor.scala +++ b/core/src/main/scala/routing/extractor/QueryExtractor.scala @@ -5,8 +5,15 @@ import java.util.UUID import scala.annotation.tailrec import scala.util.Try -trait QueryExtractor[A] { +trait QueryExtractor[A] { self => def extract(key: String, query: QueryMap): Option[A] + + final def mapO[B](f: A => Option[B]): QueryExtractor[B] = + new QueryExtractor[B] { + def extract(key: String, query: QueryMap): Option[B] = self.extract(key, query).flatMap(f) + } + + final def map[B](f: A => B): QueryExtractor[B] = mapO(a => Some(f(a))) } object QueryExtractor {