#

# Simple stream test interface based on Ruby-FLTK

# See: (http://ruby-fltk.sourceforge.net/)

#

require 'fltk'
require 'stream'

class StreamTester < Fltk::Window
  include Stream
  def initialize (s)
  super(200,200)
  @stream = s

  pack = Fltk::Pack.new(200,200) {
    %w{set_to_begin set_to_end forward backward at_end? at_beginning? current_edge entries inspect}.each { |m|
    Fltk::Button.new(50,20,m) {|w,data|
      @output.value(sendMsg(m))
      puts sendMsg(m)
    }
    }
    @output= Fltk::Input.new(200, 20)
    @output.deactivate
  }
  pack.packtype = Fltk::VERTICAL
  self.add(pack)
  self.show
  end

  def sendMsg(m)
  begin
    @stream.send(m).inspect
  rescue EndOfStreamException => msg
    msg
  end
  end
end

module Stream
  def openTester
  StreamTester.new(self)
  Fltk::run()
  end
end

if $0 == __FILE__
  def newstream; (1..6).create_stream; end
  s = newstream.filtered { |x| x % 2 == 0 } \
    + newstream.filtered { |x| x % 2 != 0 }
  s.reverse.openTester

  # an infinite stream (do not use set_to_end!)

  randomStream =
  Stream::ImplicitStream.new { |s|
  s.set_to_begin_proc = proc {srand 1234}
  s.at_end_proc = proc {false}
  s.forward_proc = proc {rand}
  }
  randomStream.filtered { |x| x >= 0.5 }.collect { |x| x*100 }.openTester
end