Advertisement
Guest User

Untitled

a guest
Jul 15th, 2014
245
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scala 1.74 KB | None | 0 0
  1. trait Channel extends java.io.Closeable {
  2.   def isOpen: Boolean
  3.   def close: Unit
  4.  
  5.   def update: Unit = ()
  6. }
  7.  
  8. trait Source[SR <: Source[SR, T], T] extends Channel {
  9.   def source: SR
  10.  
  11.   def poppable: Boolean = isOpen
  12.   def tryPop: scala.Option[T]
  13.   def pop: T
  14.   def popIn(milliseconds: Int): scala.Option[T]
  15. }
  16.  
  17. trait Sink[SN <: Sink[SN, T], T] extends Channel {
  18.   def sink: SN
  19.  
  20.   def pushable: Boolean = isOpen
  21.   def tryPush(value: T): Boolean
  22.   def push(value: T): Unit
  23.   def pushIn(value: T, milliseconds: Int): Boolean
  24. }
  25.  
  26. trait Pipe[SR <: Source[SR, T], SN <: Sink[SN, T], T]
  27.     extends Source[SR, T] with Sink[SN, T] {
  28.   override def isOpen = source.isOpen || sink.isOpen
  29.   override def close { source.close; sink.close }
  30.  
  31.   override def push(value: T) = sink.push(value)
  32.   override def pushIn(value: T, milliseconds: Int) = sink.pushIn(value, milliseconds)
  33.   override def tryPush(value: T) = sink.tryPush(value)
  34.  
  35.   override def pop = source.pop
  36.   override def popIn(milliseconds: Int) = source.popIn(milliseconds)
  37.   override def tryPop = source.tryPop
  38.  
  39.   override def poppable = source.poppable
  40.   override def pushable = sink.pushable
  41. }
  42.  
  43. class PipeOf[SR <: Source[SR, T], SN <: Sink[SN, T], T]
  44.   (_source: Source[SR, T], _sink: Sink[SN, T])
  45.     extends Pipe[SR, SN, T] {
  46.   override def source = _source.source
  47.   override def sink = _sink.sink
  48. }
  49.  
  50. object PipeOf {
  51.   def apply[SR <: Source[SR, T], SN <: Sink[SN, T], T]
  52.     (source: Source[SR, T], sink: Sink[SN, T])
  53.   = new PipeOf[SR, SN, T](source, sink)
  54. }
  55.  
  56. abstract class Wire[SR <: Source[SR, _], SN <: Sink[SN, _]] {
  57.   def convert(from: Source[SR, _], to: Sink[SN, _]): Result =
  58.     _convert(from.source, to.sink)
  59.  
  60.   protected def _convert(from: SR, to: SN): Result
  61. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement