Module: RosettAi::Composition::MergeStrategy

Defined in:
lib/rosett_ai/composition/merge_strategy.rb

Overview

Configurable merge strategies for resolving rule ID collisions across scopes. When the same rule ID exists in multiple behaviours, the merge strategy determines which value(s) appear in the final composition.

Author:

  • hugo

  • claude

Defined Under Namespace

Classes: ArrayUnion, DeepMerge, FirstWins

Constant Summary collapse

STRATEGIES =
['first_wins', 'deep_merge', 'array_union'].freeze

Class Method Summary collapse

Class Method Details

.group_by_id(rules) ⇒ Array<Array(String, Array<Hash>)>

Groups rules by ID while preserving insertion order.

Parameters:

  • rules (Array<Hash>)

    rules with :id key

Returns:

  • (Array<Array(String, Array<Hash>)>)

    ordered [id, group] pairs



37
38
39
40
41
42
43
44
45
46
47
# File 'lib/rosett_ai/composition/merge_strategy.rb', line 37

def self.group_by_id(rules)
  groups = rules.group_by { |r| r[:id] }
  seen = {}
  rules.filter_map do |rule|
    id = rule[:id]
    next if seen.key?(id)

    seen[id] = true
    [id, groups[id]]
  end
end

.resolve(name) ⇒ Class

Resolves the strategy class from a name string.

Parameters:

  • name (String)

    strategy name (first_wins, deep_merge, array_union)

Returns:

  • (Class)

    strategy class

Raises:



22
23
24
25
26
27
28
29
30
31
# File 'lib/rosett_ai/composition/merge_strategy.rb', line 22

def self.resolve(name)
  case name.to_s
  when 'first_wins'  then FirstWins
  when 'deep_merge'  then DeepMerge
  when 'array_union' then ArrayUnion
  else
    raise RosettAi::CompositionError,
          "Unknown merge strategy: #{name}. Valid: #{STRATEGIES.join(', ')}"
  end
end