Skip to content

Instantly share code, notes, and snippets.

@blast-hardcheese
Last active August 29, 2015 14:01
Show Gist options
  • Save blast-hardcheese/620ca846f80b8b13bf07 to your computer and use it in GitHub Desktop.
Save blast-hardcheese/620ca846f80b8b13bf07 to your computer and use it in GitHub Desktop.
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