Last active
August 29, 2015 14:01
-
-
Save blast-hardcheese/620ca846f80b8b13bf07 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package models | |
import scala.util.matching.Regex | |
// Deps | |
object Types { | |
type Tag = String | |
} | |
import Types._ | |
case class OperatingHours(hours: String) | |
case class Metadata(url: Option[String], hours: Option[OperatingHours]) | |
case class Marker(id: String, name: String, lat: Double, lng: Double, symbol: String, tags: List[Tag]=List.empty[Tag], metadata: Option[Metadata]=None) | |
// Filter | |
trait FilterPrimitive | |
trait FilterLogic extends FilterPrimitive | |
trait FilterPattern | |
case class StringPattern(s: String) extends FilterPattern | |
case class RegexPattern(r: Regex) extends FilterPattern | |
case class TagFilter[P <: FilterPattern](pattern: P) extends FilterPrimitive | |
case class NotFilter[F <: FilterPrimitive](filter: F) extends FilterLogic | |
case class AndFilter[F <: FilterPrimitive, G <: FilterPrimitive](left: F, right: G) extends FilterLogic | |
case class OrFilter[F <: FilterPrimitive, G <: FilterPrimitive](left: F, right: G) extends FilterLogic | |
trait FilterConversions { | |
implicit def StringPatternHandler(t: String, s: StringPattern) = t == s.s | |
implicit def RegexPatternHandler(t: String, p: RegexPattern) = p.r.findFirstIn(t) != None | |
implicit def TagFilterHandler[P <: FilterPattern](m: Marker, f: TagFilter[P])(implicit H: ((Tag, P) => Boolean)) = | |
m.tags.foldLeft[Boolean](false)({ case (acc, n) => acc || Filter.applyPattern(n, f.pattern) }) | |
implicit def AndFilterHandler[F <: FilterPrimitive, G <: FilterPrimitive](m: Marker, f: AndFilter[F, G])(implicit F: ((Marker, F) => Boolean), G: ((Marker, G) => Boolean)) = | |
Filter(m, f.left) && Filter(m, f.right) | |
implicit def OrFilterHandler[F <: FilterPrimitive, G <: FilterPrimitive](m: Marker, f: OrFilter[F, G])(implicit F: ((Marker, F) => Boolean), G: ((Marker, G) => Boolean)) = | |
Filter(m, f.left) || Filter(m, f.right) | |
implicit def NotFilterHandler[F <: FilterPrimitive](m: Marker, f: NotFilter[F])(implicit F: ((Marker, F) => Boolean)) = | |
! Filter(m, f.filter) | |
} | |
object Filter { | |
def apply[F <: FilterPrimitive](m: Marker, f: F)(implicit filterHandler: ((Marker, F) => Boolean)): Boolean = | |
filterHandler(m, f) | |
def applyPattern[P <: FilterPattern](d: Tag, pattern: P)(implicit patternHandler: ((Tag, P) => Boolean)): Boolean = | |
patternHandler(d, pattern) | |
} | |
object MyApp extends App with FilterConversions with TestData { | |
val f_restaurants = TagFilter(StringPattern("restaurant")) | |
val restaurants = dataSource.filter(m => Filter(m, f_restaurants)) | |
println(s"Restaurants: $restaurants") | |
val f_food = OrFilter(TagFilter(StringPattern("restaurant")), OrFilter(TagFilter(RegexPattern("akery$".r)), TagFilter(StringPattern("cafe")))) | |
val food = dataSource.filter(m => Filter(m, f_food)) | |
println(s"Food: $food") | |
} | |
trait TestData { | |
val dataSource = List( | |
/* Restaurants */ | |
Marker(id="0001", name="Abu Nawas", lat=22.399474275956216, lng=39.08273218518074, symbol="http://viridian.hardchee.se/belp/images/restaurants/logo_abunawas-180x100.png", tags=List("stationary", "restaurant")), | |
Marker(id="0002", name="Al Baik", lat=22.400317417327972, lng=39.084180578048745, symbol="http://viridian.hardchee.se/belp/images/restaurants/Al_Baik_logo.png", tags=List("stationary", "restaurant")), | |
Marker(id="0004", name="Al Tazaj", lat=22.400922492101692, lng=39.08401964550785, symbol="http://viridian.hardchee.se/belp/images/restaurants/200px-Al-Tazaj_logo.png", tags=List("stationary", "restaurant")), | |
Marker(id="0006", name="Five Minutes Cafe", lat=22.399861129691104, lng=39.08311842327885, symbol="http://viridian.hardchee.se/belp/images/restaurants/5minutescafe.png", tags=List("stationary", "cafe")), | |
Marker(id="0007", name="Hardee's", lat=22.399613146651575, lng=39.08229230290226, symbol="http://viridian.hardchee.se/belp/images/restaurants/hardees.png", tags=List("stationary", "fast-food")), | |
Marker(id="0008", name="Herfy", lat=22.401125836311397, lng=39.08371387368015, symbol="http://viridian.hardchee.se/belp/images/restaurants/herfy_logo.png", tags=List("stationary", "fast-food")), | |
Marker(id="0009", name="Munch Bakery", lat=22.401770584277685, lng=39.08353148346714, symbol="http://viridian.hardchee.se/belp/images/restaurants/munch-bakery.png", tags=List("stationary", "bakery")), | |
Marker(id="0010", name="Hungry Bunny", lat=22.400178547336168, lng=39.084459527786294, symbol="http://viridian.hardchee.se/belp/images/restaurants/hungrybunnylogo.png", tags=List("stationary", "fast-food")), | |
Marker(id="0012", name="Kobaibah Am Ibrahim", lat=22.399890887626114, lng=39.083697780426064, symbol="http://viridian.hardchee.se/belp/images/restaurants/kobaibah-am-ibrahim.jpg", tags=List("stationary", "restaurant")), | |
Marker(id="0013", name="Kudu", lat=22.399831371749706, lng=39.0845507228928, symbol="http://viridian.hardchee.se/belp/images/restaurants/kudu_logo.png", tags=List("stationary", "restaurant")), | |
Marker(id="0015", name="Saad Eddin", lat=22.399499074304853, lng=39.08449305539898, symbol="http://viridian.hardchee.se/belp/images/restaurants/saad-eddin.png", tags=List("stationary", "restaurant")), | |
Marker(id="0016", name="Swiss House", lat=22.39915437686224, lng=39.084737136419335, symbol="http://viridian.hardchee.se/belp/images/restaurants/swiss-house.png", tags=List("stationary", "restaurant")), | |
Marker(id="0017", name="Tako Hut", lat=22.400479845445935, lng=39.08467276340298, symbol="http://viridian.hardchee.se/belp/images/restaurants/tako-hut.png", tags=List("stationary", "fast-food")), | |
/* Food trucks */ | |
Marker(id="0018", name="Tako Truck", lat=22.401274624569055, lng=39.086181505973855, symbol="http://viridian.hardchee.se/belp/images/food-trucks/green-truck-clean2.png", tags=List("food-truck", "mobile")), | |
/* Businesses */ | |
Marker(id="0011", name="King Abdullah Port", lat=22.405961373157638, lng=39.11634562855534, symbol="http://viridian.hardchee.se/belp/images/business/king-abdullah-port.png", tags=List("stationary", "business")), | |
/* Hotels */ | |
Marker(id="0014", name="Retaj Al Bayt", lat=22.401068800770393, lng=39.080693706329384, symbol="http://viridian.hardchee.se/belp/images/business/retajlogo.png", tags=List("stationary", "hotel")), | |
Marker(id="0005", name="BayLaSun Hotel", lat=22.401810260977926, lng=39.081943615730324, symbol="http://viridian.hardchee.se/belp/images/business/baylasun.png", tags=List("stationary", "hotel")), | |
Marker(id="0003", name="Al Deyafa", lat=22.400137630258563, lng=39.081273734028855, symbol="http://viridian.hardchee.se/belp/images/business/al-deyafa.png", tags=List("stationary", "hotel")) | |
) | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment