Sha256: 100f8b911a9477515d0c760b7fa845ff46932b6d852ccfeab4f8567d11a82b3f

Contents?: true

Size: 893 Bytes

Versions: 1

Compression:

Stored size: 893 Bytes

Contents

# frozen_string_literal: true

module Umwelt::History
  class Aggregate < Umwelt::Abstract::Interactor
    expose :fragments

    def initialize
      @engaged = {}
      @forgotten = []
    end

    def call(episodes)
      episodes.each do |episode|
        index_engaged(episode.engaged)
        collect_forgotten(episode.forgotten)
      end

      verify_consistency

      @fragments = @engaged.slice(*alive_ids).values
    end

    private

    def alive_ids
      @engaged.keys - @forgotten
    end

    def fantom_ids
      @forgotten - @engaged.keys
    end

    def verify_consistency
      fantom_ids.empty? || error!("Aggregate failed: fantom ids: #{fantom_ids}")
    end

    def collect_forgotten(ids)
      @forgotten.push(*ids)
    end

    def index_engaged(fragments)
      fragments.each do |fragment|
        @engaged[fragment[:id]] = fragment
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
umwelt-0.2 lib/umwelt/history/aggregate.rb