class Speculation::AndSpec

@private

Constants

S

This is a Ruby translation of clojure.spec:

https://github.com/clojure/clojure/blob/master/src/clj/clojure/spec.clj

All credit belongs with Rich Hickey and contributors for their original work.

Public Class Methods

new(preds, gen = nil) click to toggle source
# File lib/speculation/spec/and_spec.rb, line 13
def initialize(preds, gen = nil)
  @preds = preds
  @gen   = gen
  @specs = Concurrent::Delay.new do
    preds.map { |pred| S.send(:specize, pred) }
  end
end

Public Instance Methods

conform(value) click to toggle source
# File lib/speculation/spec/and_spec.rb, line 21
def conform(value)
  @specs.value!.each do |spec|
    value = spec.conform(value)

    return :"Speculation/invalid" if S.invalid?(value)
  end

  value
end
explain(path, via, inn, value) click to toggle source
# File lib/speculation/spec/and_spec.rb, line 35
def explain(path, via, inn, value)
  S.explain_pred_list(@preds, path, via, inn, value)
end
gen(overrides, path, rmap) click to toggle source
# File lib/speculation/spec/and_spec.rb, line 43
def gen(overrides, path, rmap)
  if @gen
    @gen.call
  else
    S.gensub(@preds.first, overrides, path, rmap)
  end
end
unform(value) click to toggle source
# File lib/speculation/spec/and_spec.rb, line 31
def unform(value)
  @preds.reverse.reduce(value) { |val, pred| S.unform(pred, val) }
end
with_gen(gen) click to toggle source
# File lib/speculation/spec/and_spec.rb, line 39
def with_gen(gen)
  self.class.new(@preds, gen)
end