Sha256: 31ec623a103fe47dadbaff52435a2464fd078c7b363deae9dd811f0bdff3b856

Contents?: true

Size: 1.36 KB

Versions: 2

Compression:

Stored size: 1.36 KB

Contents

# encoding: utf-8

require "ice_nine"
require "singleton"

require_relative "selector/condition"
require_relative "selector/anything"
require_relative "selector/nothing"

require_relative "selector/not"
require_relative "selector/and"
require_relative "selector/or"

require_relative "selector/collection"
require_relative "selector/array"
require_relative "selector/regexp"
require_relative "selector/function"

# Composable filters for lists of values
#
module Selector

  # Creates a condition from options
  #
  # @param [Hash] options
  #
  # @return [Selector::Condition]
  #
  def self.new(options)
    white = options.fetch(:only)   { ANYTHING }
    black = options.fetch(:except) { NOTHING  }
    build(white) - build(black)
  end

  # Factory method that builds a condition instance depending on argument type
  #
  # @param [Object] clause
  #
  # @return [Selector::Condition]
  #
  def self.build(clause)
    return clause                 if [ANYTHING, NOTHING].include? clause
    return Regexp.new(clause)     if clause.instance_of? ::Regexp
    return Array.new(clause)      if [::Array, Set].include? clause.class
    return Collection.new(clause) if clause.is_a? Enumerable
    return Function.new(clause)   if clause.respond_to? :call
    Array.new [clause]
  end

  private # for yard

  ANYTHING = Anything.instance
  NOTHING  = Nothing.instance

end # module Selector

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
selector-0.0.2 lib/selector.rb
selector-0.0.1 lib/selector.rb