class Babl::Nodes::Switch
Public Class Methods
new(nodes)
click to toggle source
Calls superclass method
# File lib/babl/nodes/switch.rb, line 11 def initialize(nodes) raise Errors::InvalidTemplate, 'A least one switch() condition must be taken' if nodes.empty? super end
Public Instance Methods
dependencies()
click to toggle source
# File lib/babl/nodes/switch.rb, line 17 def dependencies Babl::Utils::Hash.deep_merge(nodes.flatten(1).map(&:dependencies)) end
optimize()
click to toggle source
# File lib/babl/nodes/switch.rb, line 29 def optimize optimize_condition_and_values || optimize_falsy_conditions || optimize_truthy_conditions || optimize_always_same_outputs || optimize_same_conditions || optimize_continue_to_switch || self end
pinned_dependencies()
click to toggle source
# File lib/babl/nodes/switch.rb, line 21 def pinned_dependencies Babl::Utils::Hash.deep_merge(nodes.flatten(1).map(&:pinned_dependencies)) end
render(frame)
click to toggle source
# File lib/babl/nodes/switch.rb, line 39 def render(frame) nodes.each { |cond, value| return value.render(frame) if cond.render(frame) } raise Errors::RenderingError, 'A least one switch() condition must be taken' end
schema()
click to toggle source
# File lib/babl/nodes/switch.rb, line 25 def schema Schema::AnyOf.canonicalized(nodes.map(&:last).map(&:schema)) end
Private Instance Methods
optimize_always_same_outputs()
click to toggle source
# File lib/babl/nodes/switch.rb, line 64 def optimize_always_same_outputs return unless nodes.map(&:first).any? { |node| Constant === node && node.value } return unless nodes.map(&:last).uniq.size == 1 nodes.first.last.optimize end
optimize_condition_and_values()
click to toggle source
# File lib/babl/nodes/switch.rb, line 78 def optimize_condition_and_values optimized = nodes.map { |k, v| [k.optimize, v.optimize] } optimized == nodes ? nil : Switch.new(optimized).optimize end
optimize_continue_to_switch()
click to toggle source
# File lib/babl/nodes/switch.rb, line 46 def optimize_continue_to_switch cond, val = nodes.last return unless Switch === val && Constant === cond && cond.value Switch.new(nodes[0...-1] + val.nodes).optimize end
optimize_falsy_conditions()
click to toggle source
# File lib/babl/nodes/switch.rb, line 83 def optimize_falsy_conditions optimized = nodes.reject { |(cond, _value)| Constant === cond && !cond.value } optimized.size == nodes.size ? nil : Switch.new(optimized).optimize end
optimize_same_conditions()
click to toggle source
# File lib/babl/nodes/switch.rb, line 53 def optimize_same_conditions conds = Set.new new_nodes = nodes.map { |cond, val| next if conds.include?(cond) conds << cond [cond, val] }.compact new_nodes.size == nodes.size ? nil : Switch.new(new_nodes).optimize end
optimize_truthy_conditions()
click to toggle source
# File lib/babl/nodes/switch.rb, line 71 def optimize_truthy_conditions nodes[0...-1].each_with_index do |(cond, _value), index| return Switch.new(nodes[0..index]).optimize if Constant === cond && cond.value end nil end