Class: PaperTrailDiff::CollectionIdentityIndex

Inherits:
Object
  • Object
show all
Defined in:
lib/paper_trail_diff/collection_identity_index.rb,
sig/generated/paper_trail_diff/collection_identity_index.rbs

Overview

Immutable positions for one collection membership and ordering.

Instance Method Summary collapse

Constructor Details

#initialize(records) ⇒ CollectionIdentityIndex

: (Array) -> void

Parameters:

  • (Array[untyped])


8
9
10
11
12
13
14
15
16
17
# File 'lib/paper_trail_diff/collection_identity_index.rb', line 8

def initialize(records)
  @positions = {} #: Hash[Array[untyped], Integer]
  @serialized_positions = {} #: Hash[Array[String], Integer]
  @id_positions = {} #: Hash[String, Integer?]
  records.each_with_index { |record, index| register(record, index) }
  @positions.freeze
  @serialized_positions.freeze
  @id_positions.freeze
  freeze
end

Instance Method Details

#position(type, id) ⇒ Integer?

: (untyped, untyped) -> Integer?

Parameters:

  • (Object)
  • (Object)

Returns:

  • (Integer, nil)


20
21
22
# File 'lib/paper_trail_diff/collection_identity_index.rb', line 20

def position(type, id)
  @serialized_positions[[type.to_s, id.to_s]]
end

#position_for_id(id) ⇒ Integer?

: (untyped) -> Integer?

Parameters:

  • (Object)

Returns:

  • (Integer, nil)


25
26
27
# File 'lib/paper_trail_diff/collection_identity_index.rb', line 25

def position_for_id(id)
  @id_positions[id.to_s]
end

#register(record, index) ⇒ void

This method returns an undefined value.

: (untyped, Integer) -> void

Parameters:

  • (Object)
  • (Integer)


36
37
38
39
40
41
42
43
44
45
# File 'lib/paper_trail_diff/collection_identity_index.rb', line 36

def register(record, index)
  identity = record.identity
  if @positions.key?(identity)
    raise ArgumentError, "duplicate record identity: #{identity.inspect}"
  end

  @positions[identity] = index
  @serialized_positions[[record.type.to_s, record.id.to_s]] = index
  register_id(record.id, index)
end

#register_id(id, index) ⇒ void

This method returns an undefined value.

: (untyped, Integer) -> void

Parameters:

  • (Object)
  • (Integer)


48
49
50
51
# File 'lib/paper_trail_diff/collection_identity_index.rb', line 48

def register_id(id, index)
  key = id.to_s
  @id_positions[key] = @id_positions.key?(key) ? nil : index
end