Guest User

Untitled

a guest
Jul 15th, 2018
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 0.89 KB | None | 0 0
  1. module Selectable
  2. def recieve?; false; end
  3. def send?; true; end
  4. end
  5.  
  6. class Channel
  7. include Selectable
  8.  
  9. def recieve
  10. 'hai'
  11. end
  12. end
  13.  
  14. class Selector
  15. def initialize
  16. @cases = []
  17. @immediate = nil
  18. @default = nil
  19. end
  20.  
  21. def default(&blk); @default = blk; end
  22.  
  23. def case(condition, &blk)
  24. @immediate = blk if condition && !@immediate
  25. @cases.push blk
  26. end
  27.  
  28. def select
  29. if @immediate
  30. @immediate.call
  31. elsif !@default.nil?
  32. @default.call
  33. else
  34. p [@cases.size, :cases]
  35. end
  36. end
  37. end
  38.  
  39. def select(&blk)
  40. s = Selector.new
  41. yield s
  42. s.select
  43. end
  44.  
  45. c = Channel.new
  46.  
  47. select do |s|
  48. s.case(c.recieve?) { p c.recieve }
  49. s.case(false) { p 2 }
  50. s.default { p :default }
  51. end
  52.  
  53. select do |s|
  54. s.case(c.recieve?) { p c.recieve }
  55. s.case(true) { p true }
  56. end
  57.  
  58. select do |s|
  59. s.case(false) { p false }
  60. end
  61.  
  62. puts "Done"
  63.  
  64. # :default
  65. # true
  66. # [1, :cases]
  67. # Done
Add Comment
Please, Sign In to add comment