Guest User

Untitled

a guest
Jul 19th, 2018
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.28 KB | None | 0 0
  1. object GlobMatcher {
  2.  
  3. trait matcher {
  4. def apply(rest: List[matcher], segments: List[String]): List[String] Either Boolean
  5. }
  6.  
  7. def matcher(str: String): matcher = str match {
  8. case "**" ⇒ **
  9. case s ⇒ regex(s.replaceAllLiterally("*", ".*"))
  10. }
  11.  
  12. def next(rest: List[matcher], segments: List[String]): List[String] Either Boolean = (rest, segments) match {
  13. case (head :: tail, s) ⇒ head(tail, s)
  14. case (Nil, Nil) ⇒ Right(true)
  15. case (Nil, s) ⇒ Left(s)
  16. }
  17.  
  18. object ** extends matcher {
  19. override def apply(rest: List[matcher], segments: List[String]): List[String] Right Boolean = next(rest.reverse, segments.reverse) match {
  20. case Left(_) ⇒ Right(true)
  21. case Right(result) ⇒ Right(result)
  22. }
  23. }
  24.  
  25. case class regex(value: String) extends matcher {
  26. override def apply(rest: List[matcher], segments: List[String]): List[String] Either Boolean = segments match {
  27. case head :: tail if head.matches(s"^$value$$") ⇒ next(rest, tail)
  28. case _ ⇒ Right(false)
  29. }
  30. }
  31.  
  32. def apply(pattern: String, strict: Boolean = true): String ⇒ Boolean = {
  33. val matchers = pattern.split("\\/").toList.map(matcher)
  34. s ⇒ next(matchers, s.split("\\/").toList).fold(_ ⇒ !strict, identity)
  35. }
  36.  
  37. val m = GlobMatcher("a/**/c")
  38. m("a/b/c")
  39. }
Add Comment
Please, Sign In to add comment