Sha256: 9fbf42a399d5e25f83524b7f439aee7f7efc0daa1d3e3783f99e441a97809bf9

Contents?: true

Size: 1.19 KB

Versions: 3

Compression:

Stored size: 1.19 KB

Contents

module Econfig
  class BackendCollection
    include Enumerable

    def initialize
      @backends = []
    end

    def [](name)
      pair = @backends.assoc(name)
      pair.last if pair
    end

    def each
      if block_given?
        @backends.each { |(name, backend)| yield backend }
      else
        enum_for { @backends.length }
      end
    end

    def push(name, backend)
      exists‽(name)
      @backends.push([name, backend])
    end
    alias_method :use, :push

    def unshift(name, backend)
      exists‽(name)
      @backends.unshift([name, backend])
    end

    def insert_before(other, name, backend)
      exists‽(name)
      @backends.insert(index_of!(other), [name, backend])
    end

    def insert_after(other, name, backend)
      exists‽(name)
      @backends.insert(index_of!(other) + 1, [name, backend])
    end

    def delete(name)
      @backends.delete_at(index_of!(name))
    end

  private

    def exists‽(name)
      raise KeyError, "#{name} is already set" if index_of(name)
    end

    def index_of!(name)
      index_of(name) or raise KeyError, "#{name} is not set"
    end

    def index_of(name)
      @backends.index(@backends.assoc(name))
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
econfig-1.0.2 lib/econfig/backend_collection.rb
econfig-1.0.1 lib/econfig/backend_collection.rb
econfig-1.0.0 lib/econfig/backend_collection.rb