Sha256: d3c9f8983e1e89b443276636d4f83ea1bf359f53247d871cc0035a03ad363413

Contents?: true

Size: 805 Bytes

Versions: 7

Compression:

Stored size: 805 Bytes

Contents

module NxtSupport
  class Crystalizer
    Error = Class.new(StandardError)

    include NxtInit

    attr_init :collection, on_ambiguity: -> { default_ambiguity_handler }, with: :itself

    def call
      ensure_unanimity
      unique_values.first
    end

    private

    def unique_values
      @unique_values ||= resolved_collection.uniq
    end

    def resolved_collection
      @resolved_collection ||= collection.map { |value| with.is_a?(Proc) ? with.call(value) : value.send(with) }
    end

    def default_ambiguity_handler
      ->(collection) { raise Error, "Values in collection are not unanimous: #{collection}" }
    end

    def ensure_unanimity
      return if unique_values.size == 1

      on_ambiguity.arity == 1 ? on_ambiguity.call(collection) : on_ambiguity.call
    end
  end
end

Version data entries

7 entries across 7 versions & 1 rubygems

Version Path
nxt_support-0.2.1 lib/nxt_support/util/crystalizer.rb
nxt_support-0.2.0 lib/nxt_support/util/crystalizer.rb
nxt_support-0.1.16 lib/nxt_support/util/crystalizer.rb
nxt_support-0.1.15 lib/nxt_support/util/crystalizer.rb
nxt_support-0.1.9 lib/nxt_support/util/crystalizer.rb
nxt_support-0.1.8 lib/nxt_support/util/crystalizer.rb
nxt_support-0.1.7 lib/nxt_support/util/crystalizer.rb