elektronaut/dis

View on GitHub
lib/dis/layers.rb

Summary

Maintainability
A
0 mins
Test Coverage
A
100%
# frozen_string_literal: true

module Dis
  # = Dis Layers
  #
  # Represents a collection of layers.
  class Layers
    include Enumerable

    def initialize(layers = [])
      @layers = layers
    end

    # Adds a layer to the collection.
    def <<(layer)
      @layers << layer
    end

    # Clears all layers from the collection.
    def clear!
      @layers = []
    end

    # Iterates over the layers.
    def each(&block)
      @layers.each { |layer| block.call(layer) }
    end

    # Returns a new instance containing only the delayed layers.
    def delayed
      self.class.new select(&:delayed?)
    end

    # Returns true if one or more delayed layers exist.
    def delayed?
      delayed.any?
    end

    # Returns a new instance containing only the immediate layers.
    def immediate
      self.class.new select(&:immediate?)
    end

    # Returns true if one or more immediate layers exist.
    def immediate?
      immediate.any?
    end

    # Returns a new instance containing only the readonly layers.
    def readonly
      self.class.new select(&:readonly?)
    end

    # Returns true if one or more readonly layers exist.
    def readonly?
      readonly.any?
    end

    # Returns a new instance containing only the writeable layers.
    def writeable
      self.class.new select(&:writeable?)
    end

    # Returns true if one or more writeable layers exist.
    def writeable?
      writeable.any?
    end
  end
end