Module: Dhall::Parser::Expression

Defined in:
lib/dhall/parser.rb

Instance Method Summary collapse

Instance Method Details

#arrowObject



59
60
61
62
63
64
# File 'lib/dhall/parser.rb', line 59

def arrow
  Forall.of_arguments(
    capture(:operator_expression).value,
    body: capture(:expression).value
  )
end

#forallObject



51
52
53
54
55
56
57
# File 'lib/dhall/parser.rb', line 51

def forall
  Forall.new(
    var:  capture(:nonreserved_label).value,
    type: captures(:expression)[0].value,
    body: captures(:expression)[1].value
  )
end

#ifObject



66
67
68
69
70
71
72
# File 'lib/dhall/parser.rb', line 66

def if
  If.new(
    predicate: captures(:expression)[0].value,
    then:      captures(:expression)[1].value,
    else:      captures(:expression)[2].value
  )
end

#lambdaObject



43
44
45
46
47
48
49
# File 'lib/dhall/parser.rb', line 43

def lambda
  Function.new(
    var:  capture(:nonreserved_label).value,
    type: captures(:expression)[0].value,
    body: captures(:expression)[1].value
  )
end

#let_bindingObject



36
37
38
39
40
41
# File 'lib/dhall/parser.rb', line 36

def let_binding
  LetBlock.for(
    lets: captures(:let_binding).map(&:value),
    body: capture(:expression).value
  )
end

#mergeObject



74
75
76
77
78
79
80
# File 'lib/dhall/parser.rb', line 74

def merge
  Merge.new(
    record: captures(:import_expression)[0].value,
    input:  captures(:import_expression)[1].value,
    type:   capture(:application_expression)&.value
  )
end

#valueObject



23
24
25
26
27
28
29
30
31
32
33
34
# File 'lib/dhall/parser.rb', line 23

def value
  key =
    [:let_binding, :lambda, :forall, :arrow, :if, :merge]
    .find { |k| captures.key?(k) }

  return public_send(key) if key

  key =
    [:empty_collection, :non_empty_optional]
    .find { |k| captures.key?(k) }
  key ? capture(key).value : super
end