Class: Camille::Types::Tuple

Inherits:
BasicType show all
Defined in:
lib/camille/types/tuple.rb

Instance Attribute Summary collapse

Attributes inherited from BasicType

#fingerprint

Instance Method Summary collapse

Methods inherited from BasicType

&, #&, #[], [], directly_instantiable?, inherited, instance, #transform, #|, |

Constructor Details

#initialize(elements) ⇒ Tuple

Returns a new instance of Tuple.



6
7
8
9
# File 'lib/camille/types/tuple.rb', line 6

def initialize elements
  @elements = elements.map{|e| Camille::Type.instance e}
  @fingerprint = Digest::MD5.hexdigest "#{self.class.name}#{@elements.map(&:fingerprint)}"
end

Instance Attribute Details

#elementsObject (readonly)

Returns the value of attribute elements.



4
5
6
# File 'lib/camille/types/tuple.rb', line 4

def elements
  @elements
end

Instance Method Details

#check(value) ⇒ Object



11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# File 'lib/camille/types/tuple.rb', line 11

def check value
  if value.is_a?(::Array) && value.size == @elements.size
    results = @elements.map.with_index do |type, index|
      [index, type.check(value[index])]
    end

    errors = results.map do |index, result|
      if result.type_error?
        ["tuple[#{index}]", result]
      else
        nil
      end
    end.compact

    if errors.empty?
      Camille::Checked.new(fingerprint, results.map{|_, checked| checked.value})
    else
      Camille::TypeError.new(**errors.to_h)
    end
  else
    Camille::TypeError.new("Expected array of size #{@elements.size}, got #{value.inspect}.")
  end
end

#literalObject



35
36
37
# File 'lib/camille/types/tuple.rb', line 35

def literal
  "[#{elements.map(&:literal).join(', ')}]"
end