Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- module Selectable
- def recieve?; false; end
- def send?; true; end
- end
- class Channel
- include Selectable
- def recieve
- 'hai'
- end
- end
- class Selector
- def initialize
- @cases = []
- @immediate = nil
- @default = nil
- end
- def default(&blk); @default = blk; end
- def case(condition, &blk)
- @immediate = blk if condition && !@immediate
- @cases.push blk
- end
- def select
- if @immediate
- @immediate.call
- elsif !@default.nil?
- @default.call
- else
- p [@cases.size, :cases]
- end
- end
- end
- def select(&blk)
- s = Selector.new
- yield s
- s.select
- end
- c = Channel.new
- select do |s|
- s.case(c.recieve?) { p c.recieve }
- s.case(false) { p 2 }
- s.default { p :default }
- end
- select do |s|
- s.case(c.recieve?) { p c.recieve }
- s.case(true) { p true }
- end
- select do |s|
- s.case(false) { p false }
- end
- puts "Done"
- # :default
- # true
- # [1, :cases]
- # Done
Add Comment
Please, Sign In to add comment