Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- object GlobMatcher {
- trait matcher {
- def apply(rest: List[matcher], segments: List[String]): List[String] Either Boolean
- }
- def matcher(str: String): matcher = str match {
- case "**" ⇒ **
- case s ⇒ regex(s.replaceAllLiterally("*", ".*"))
- }
- def next(rest: List[matcher], segments: List[String]): List[String] Either Boolean = (rest, segments) match {
- case (head :: tail, s) ⇒ head(tail, s)
- case (Nil, Nil) ⇒ Right(true)
- case (Nil, s) ⇒ Left(s)
- }
- object ** extends matcher {
- override def apply(rest: List[matcher], segments: List[String]): List[String] Right Boolean = next(rest.reverse, segments.reverse) match {
- case Left(_) ⇒ Right(true)
- case Right(result) ⇒ Right(result)
- }
- }
- case class regex(value: String) extends matcher {
- override def apply(rest: List[matcher], segments: List[String]): List[String] Either Boolean = segments match {
- case head :: tail if head.matches(s"^$value$$") ⇒ next(rest, tail)
- case _ ⇒ Right(false)
- }
- }
- def apply(pattern: String, strict: Boolean = true): String ⇒ Boolean = {
- val matchers = pattern.split("\\/").toList.map(matcher)
- s ⇒ next(matchers, s.split("\\/").toList).fold(_ ⇒ !strict, identity)
- }
- val m = GlobMatcher("a/**/c")
- m("a/b/c")
- }
Add Comment
Please, Sign In to add comment