Advertisement
Guest User

Untitled

a guest
Jul 29th, 2016
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.33 KB | None | 0 0
  1. protocol PatternComparable {}
  2.  
  3. struct Pattern<C: Comparable>: PatternComparable {
  4. let op: (lhs: C, rhs: C) -> Bool
  5. let to: C
  6. func compare(from: C) -> Bool {
  7. return op(lhs: from, rhs: to)
  8. }
  9. }
  10.  
  11. func patternize<C: Comparable>(op: (lhs: C, rhs: C) -> Bool, _ to: C) -> Pattern<C> {
  12. return Pattern<C>(op: op, to: to)
  13. }
  14.  
  15. func ~=<C: Comparable>(pattern: Pattern<C>, value: C) -> Bool {
  16. return pattern.compare(value)
  17. }
  18.  
  19. func ~=<C: Comparable>(pattern: (op:(lhs: C, rhs: C)->Bool, to:C), value: C) -> Bool {
  20. return pattern.0(lhs:value, rhs: pattern.1)
  21. }
  22.  
  23. protocol Patternable {}
  24. extension Int: Patternable {}
  25. extension Int8: Patternable {}
  26. extension Int16: Patternable {}
  27. extension Int32: Patternable {}
  28. extension Int64: Patternable {}
  29. extension UInt: Patternable {}
  30. extension UInt8: Patternable {}
  31. extension UInt16: Patternable {}
  32. extension UInt32: Patternable {}
  33. extension UInt64: Patternable {}
  34. extension Double: Patternable {}
  35. extension Float: Patternable {}
  36. extension CGFloat: Patternable {}
  37.  
  38. extension Patternable {
  39. func patterned<C: Comparable>(op: (lhs:C, rhs:C) -> Bool) -> Pattern<C> {
  40. return Pattern<C>(op: op, to: self as! C)
  41. }
  42. }
  43.  
  44. let value = 1000
  45.  
  46. switch value {
  47. case patternize(<=, 101):
  48. print("smaller than 99")
  49. case patternize(>, 999):
  50. print("bigger than 999")
  51. default:
  52. print("default")
  53. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement