lib/factbase/accum.rb
# frozen_string_literal: true # SPDX-FileCopyrightText: Copyright (c) 2024-2025 Yegor Bugayenko # SPDX-License-Identifier: MIT require 'others' require_relative '../factbase' # Accumulator of props, a decorator of +Factbase::Fact+. # # Author:: Yegor Bugayenko (yegor256@gmail.com) # Copyright:: Copyright (c) 2024-2025 Yegor Bugayenko # License:: MIT class Factbase::Accum # Ctor. # @param [Factbase::Fact] fact The fact to decorate # @param [Hash] props Hash of props that were set # @param [Boolean] pass TRUE if all "set" operations must go through, to the +fact+ def initialize(fact, props, pass) @fact = fact @props = props @pass = pass end def to_s "#{@fact} + #{@props}" end def all_properties @fact.all_properties end others do |*args| k = args[0].to_s if k.end_with?('=') kk = k[0..-2] @props[kk] = [] if @props[kk].nil? @props[kk] << args[1] @fact.method_missing(*args) if @pass elsif k == '[]' kk = args[1].to_s vv = @props[kk].nil? ? [] : @props[kk] vvv = @fact.method_missing(*args) vvv = [vvv] unless vvv.nil? || vvv.respond_to?(:to_a) vv += vvv.to_a unless vvv.nil? vv.uniq! vv.empty? ? nil : vv elsif @props[k].nil? @fact.public_send(*args) else @props[k][0] end end end