Guest User

Untitled

a guest
Jun 18th, 2018
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.44 KB | None | 0 0
  1. package reactive
  2.  
  3. import scala.collection.SeqLike
  4. import scala.collection.generic._
  5. import scala.collection.mutable.{Builder, ListBuffer}
  6.  
  7. trait TransformedSeq[+A] extends Seq[A]
  8. with GenericTraversableTemplate[A, TransformedSeq]
  9. with SeqLike[A, TransformedSeq[A]] {
  10. override def companion: GenericCompanion[TransformedSeq] = TransformedSeq
  11.  
  12. val underlying: Seq[A]
  13.  
  14. def apply(i: Int): A = underlying(i)
  15. def length = underlying.length
  16. def iterator = underlying.iterator
  17. }
  18.  
  19. object TransformedSeq extends SeqFactory[TransformedSeq] {
  20. implicit def canBuildFrom[A]: CanBuildFrom[Coll, A, TransformedSeq[A]] = new GenericCanBuildFrom[A]
  21. def newBuilder[A]: Builder[A, TransformedSeq[A]] = new ListBuffer[A] mapResult fromSeq
  22. def fromSeq[A](seq: Seq[A]) = new TransformedSeq[A] { val underlying = seq }
  23. }
  24.  
  25. trait Signal[A] extends SignalLike[A, Signal[A]] {
  26. def content: A
  27. }
  28.  
  29. object Signal {
  30. def apply[A](value: A) = new ValueSignal(value)
  31. }
  32.  
  33. trait SignalLike[A, +This <: SignalLike[A, This]] {
  34. def map[B, To](f: A => B)(implicit mapper: SignalMapper[This, A, B, To]): To
  35. }
  36.  
  37. class ValueSignal[A](value: A) extends Signal[A] with SignalLike[A, ValueSignal[A]] {
  38. def content = value
  39. def map[B, To](f: A => B)(implicit mapper: SignalMapper[ValueSignal[A], A, B, To]): To = mapper(this, f)
  40. override def toString = "ValueSignal(" + content + ")"
  41. }
  42.  
  43. class SeqSignal[A](seq: TransformedSeq[A]) extends Signal[TransformedSeq[A]] with SignalLike[TransformedSeq[A], SeqSignal[A]] {
  44. def this(seq: Seq[A]) = this(TransformedSeq(seq: _*))
  45. def content = seq
  46. def map[B, To](f: TransformedSeq[A] => B)(implicit mapper: SignalMapper[SeqSignal[A], TransformedSeq[A], B, To]): To = mapper(this, f)
  47. override def toString = seq.mkString("SeqSignal(", ", ", ")")
  48. }
  49.  
  50. object SeqSignal {
  51. def apply[A](values: A*) = new SeqSignal(TransformedSeq(values: _*))
  52. }
  53.  
  54. trait SignalMapper[-From, A, B, To] {
  55. def apply(from: From, f: A => B): To
  56. }
  57.  
  58. trait GenericSignalMapper {
  59. implicit def mapSignal[A, B] = new SignalMapper[Signal[A], A, B, ValueSignal[B]] {
  60. def apply(s: Signal[A], f: A => B): ValueSignal[B] = new ValueSignal(f(s.content))
  61. }
  62. }
  63.  
  64. object SignalMapper extends GenericSignalMapper {
  65. implicit def mapSeqSignal[A, B] = new SignalMapper[SeqSignal[A], TransformedSeq[A], TransformedSeq[B], SeqSignal[B]] {
  66. def apply(s: SeqSignal[A], f: TransformedSeq[A] => TransformedSeq[B]): SeqSignal[B] = new SeqSignal(f(s.content))
  67. }
  68. }
Add Comment
Please, Sign In to add comment