Sha256: b6c32f5543e494cc93a1c2caff28ce53caaaecc157725e9cc3799da4fa5bebe1

Contents?: true

Size: 954 Bytes

Versions: 1

Compression:

Stored size: 954 Bytes

Contents

require "forwardable"

module SequelMapper
  class AssociationProxy
    def initialize(assoc_enum)
      @assoc_enum = assoc_enum
      @added_nodes = []
      @removed_nodes = []
    end

    attr_reader :assoc_enum, :removed_nodes, :added_nodes
    private     :assoc_enum

    include Enumerable
    def each(&block)
      enum = Enumerator.new do |yielder|
        assoc_enum.each do |element|
          yielder.yield(element) unless removed?(element)
        end

        @added_nodes.each do |node|
          yielder.yield(node)
        end
      end

      if block
        enum.each(&block)
        self
      else
        enum
      end
    end

    def remove(node)
      @removed_nodes.push(node)
      self
    end

    def push(node)
      @added_nodes.push(node)
    end

    def where(criteria)
      @assoc_enum.where(criteria)
      self
    end

    private

    def removed?(node)
      @removed_nodes.include?(node)
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
sequel_mapper-0.0.1 lib/sequel_mapper/association_proxy.rb