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