File: collection.rb

package info (click to toggle)
ruby-pluggaloid 1.7.0-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 260 kB
  • sloc: ruby: 1,752; sh: 4; makefile: 2
file content (55 lines) | stat: -rw-r--r-- 1,169 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# frozen_string_literal: true

module Pluggaloid
  class Collection
    attr_reader :values

    def initialize(event, *args)
      @event = event
      args[event.collect_index] = nil
      @args = args.freeze
      @spec = argument_hash(args)
      @values = [].freeze
    end

    def add(*v)
      rewind do |primitive|
        primitive + v
      end
    end
    alias_method :<<, :add

    def delete(*v)
      rewind do |primitive|
        primitive - v
      end
    end

    def rewind(&block)
      new_values = block.(@values.dup)
      added, deleted = new_values - @values, @values - new_values
      @values = new_values.freeze
      unless added.empty?
        args = @args.dup
        args[@event.collect_index] = added
        @event.collection_add_event.call(*args)
      end
      unless deleted.empty?
        args = @args.dup
        args[@event.collect_index] = deleted
        @event.collection_delete_event.call(*args)
      end
      self
    end

    def argument_hash_same?(specs)
      @spec == argument_hash(specs)
    end

    private

    def argument_hash(specs)
      @event.argument_hash(specs, @event.collect_index)
    end
  end
end