Class: Rewrite::ByExample::Composition

Inherits:
Sequence
  • Object
show all
Defined in:
lib/rewrite/by_example/composition.rb

Overview

A Composition is an aggregation of Sequence. So where a LengthOne and a BindSequence are both leaves of a sequence tree, a Composition is a node.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(*sub_sequences) ⇒ Composition

Returns a new instance of Composition.



13
14
15
16
# File 'lib/rewrite/by_example/composition.rb', line 13

def initialize(*sub_sequences)
  @sub_sequences = sub_sequences#.map { |sub| Sequence.from_object(sub) }
  @length_range = range_sum(@sub_sequences)
end

Instance Attribute Details

#length_rangeObject (readonly)

Returns the value of attribute length_range.



11
12
13
# File 'lib/rewrite/by_example/composition.rb', line 11

def length_range
  @length_range
end

#sub_sequencesObject (readonly)

Returns the value of attribute sub_sequences.



11
12
13
# File 'lib/rewrite/by_example/composition.rb', line 11

def sub_sequences
  @sub_sequences
end

Instance Method Details

#fold(enum_of_bindings) ⇒ Object



26
27
28
29
30
31
32
33
34
35
36
37
# File 'lib/rewrite/by_example/composition.rb', line 26

def fold(enum_of_bindings)
  sub_sequences.inject(s()) { |refolded, sub_sequence|
    folded = sub_sequence.fold(enum_of_bindings)
    if folded.nil?
      s(*(refolded + [nil]))
    elsif sub_sequence.is_a? LengthOne
      s(*(refolded + [folded]))
    else
      s(*(refolded + folded))
    end
  }
end

#to_sObject



22
23
24
# File 'lib/rewrite/by_example/composition.rb', line 22

def to_s
  sub_sequences.map { |ss| ss.to_s }.join(', ')
end

#unfolders_by_length(length) ⇒ Object



18
19
20
# File 'lib/rewrite/by_example/composition.rb', line 18

def unfolders_by_length(length)
  unfolders_by_length_helper(sub_sequences(), length)
end