Class: Egison::Multiset
Class Method Summary collapse
- .uncons(val) ⇒ Object
- .uncons_stream(val, &block) ⇒ Object
- .unjoin(val) ⇒ Object
- .unjoin_stream(val, &block) ⇒ Object
Class Method Details
.uncons(val) ⇒ Object
13 14 15 16 17 18 19 |
# File 'lib/egison/matcher.rb', line 13 def uncons(val) match_all(val) do with(List.(*_hs, _x, *_ts)) do [x, hs + ts] end end end |
.uncons_stream(val, &block) ⇒ Object
21 22 23 24 25 26 27 28 29 30 31 |
# File 'lib/egison/matcher.rb', line 21 def uncons_stream(val, &block) if !(val.kind_of?(Array) || val.kind_of?(Egison::LazyArray)) val = test_conv_lazy_array(val) end stream = match_stream(val) { with(List.(*_hs, _x, *_ts)) do [x, hs + ts] end } stream.each(&block) end |
.unjoin(val) ⇒ Object
33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
# File 'lib/egison/matcher.rb', line 33 def unjoin(val) val2 = val.clone xs = [] ys = val2.clone rets = [[xs, ys]] if val2.empty? rets else x = val2.shift ys = val2.clone rets2 = unjoin(ys) rets = (rets2.map { |xs2, ys2| [xs2, [x] + ys2] }) + (rets2.map { |xs2, ys2| [[x] + xs2, ys2] }) rets end end |
.unjoin_stream(val, &block) ⇒ Object
49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
# File 'lib/egison/matcher.rb', line 49 def unjoin_stream(val, &block) if !(val.kind_of?(Array) || val.kind_of?(Egison::LazyArray)) val = test_conv_lazy_array(val) end val2 = val.clone xs = [] ys = val2.clone block.([xs, ys]) unless val2.empty? x = val2.shift ys = val2.clone unjoin_stream(ys) do |xs2, ys2| block.([xs2, [x] + ys2]) unless xs2.empty? block.([[x] + xs2, ys2]) end end end |