Advertisement
Guest User

Untitled

a guest
Jun 26th, 2019
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.09 KB | None | 0 0
  1. // Traits are like interfaces
  2. trait MySet[A] extends (A => Boolean) {
  3. def apply(element: A): Boolean = contains(element)
  4.  
  5. def contains(element: A): Boolean
  6.  
  7. def +(element: A): MySet[A]
  8. def ++(otherSet: MySet[A]): MySet[A]
  9. def -(element: A): MySet[A]
  10. def --(otherSet: MySet[A]): MySet[A]
  11.  
  12. def map[B](fn: A => B): MySet[B]
  13. def flatMap[B](fn: A => MySet[B]): MySet[B]
  14. def filter(fn: A => Boolean): MySet[A]
  15. def foreach(fn: A => Unit): Unit
  16. }
  17.  
  18. class EmptySet[A] extends MySet[A] {
  19. def contains(element: A): Boolean = false
  20.  
  21. def +(element: A): MySet[A] = new NonEmptySet(element, this)
  22. def ++(otherSet: MySet[A]): MySet[A] = otherSet
  23. def -(element: A): MySet[A] = this
  24. def --(otherSet: MySet[A]): MySet[A] = this
  25.  
  26. def map[B](fn: A => B): MySet[B] = new EmptySet[B]
  27. def flatMap[B](fn: A => MySet[B]): MySet[B] = new EmptySet[B]
  28. def filter(fn: A => Boolean): MySet[A] = this
  29. def foreach(fn: A => Unit): Unit = ()
  30. }
  31.  
  32. class NonEmptySet[A](head: A, tail: MySet[A]) extends MySet[A] {
  33. def contains(element: A): Boolean =
  34. head == element || tail.contains(element)
  35.  
  36. def +(element: A): MySet[A] =
  37. if (this contains element) this
  38. else new NonEmptySet[A](element, this)
  39.  
  40. def ++(otherSet: MySet[A]): MySet[A] =
  41. tail ++ otherSet + head
  42.  
  43. def -(element: A): MySet[A] =
  44. if (head == element) tail
  45. else tail - element + head
  46.  
  47. def --(otherSet: MySet[A]): MySet[A] = filter(e => !otherSet.contains(e))
  48.  
  49. def map[B](fn: A => B): MySet[B] = (tail map fn) + fn(head)
  50. def flatMap[B](fn: A => MySet[B]): MySet[B] = (tail flatMap fn) ++ fn(head)
  51. def filter(fn: A => Boolean): MySet[A] = {
  52. val filteredTail = tail filter fn
  53. if (fn(head)) filteredTail + head
  54. else filteredTail
  55. }
  56. def foreach(fn: A => Unit): Unit = {
  57. fn(head)
  58. tail foreach fn
  59. }
  60. }
  61.  
  62. object MySet {
  63. def apply[A](values: A*): MySet[A] = {
  64. @tailrec
  65. def buildSet(valueSequence: Seq[A], accumulator: MySet[A]): MySet[A] = {
  66. if (valueSequence.isEmpty) accumulator
  67. else buildSet(valueSequence.tail, accumulator + valueSequence.head)
  68. }
  69.  
  70. buildSet(values.toSeq, new EmptySet[A])
  71. }
  72. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement