Class: Egison::Multiset

Inherits:
Object show all
Defined in:
lib/egison/matcher.rb

Class Method Summary collapse

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