Class: Dhall::Application

Inherits:
Expression show all
Defined in:
lib/dhall/ast.rb,
lib/dhall/binary.rb,
lib/dhall/normalize.rb

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from Expression

#&, #*, #+, #annotate, #as_dhall, #cache_key, #call, #concat, #deep_merge, #deep_merge_type, #dhall_eq, #digest, #fetch, #fusion, #merge, #resolve, #shift, #slice, #substitute, #to_binary, #to_cbor, #to_proc, #to_s, #|

Class Method Details

.decode(function, *args) ⇒ Object



54
55
56
57
58
59
# File 'lib/dhall/binary.rb', line 54

def self.decode(function, *args)
  function = Dhall.decode(function)
  args.map(&Dhall.method(:decode)).reduce(function) do |f, arg|
    self.for(function: f, argument: arg)
  end
end

.for(function:, argument:) ⇒ Object



126
127
128
129
130
131
132
# File 'lib/dhall/ast.rb', line 126

def self.for(function:, argument:)
  if function == Builtins[:None]
    OptionalNone.new(value_type: argument)
  else
    new(function: function, argument: argument)
  end
end

Instance Method Details

#as_jsonObject



147
148
149
150
# File 'lib/dhall/ast.rb', line 147

def as_json
  function, arguments = flatten
  [0, function.as_json, *arguments.map(&:as_json)]
end

#flattenObject



134
135
136
137
138
139
140
141
142
143
144
145
# File 'lib/dhall/ast.rb', line 134

def flatten
  f, args = if function.is_a?(Application)
    function.flatten
  elsif function.is_a?(BuiltinFunction) &&
        (unfilled = function.unfill).is_a?(Application)
    unfilled.flatten
  else
    [function, []]
  end

  [f, args + [argument]]
end

#fuseObject



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

def fuse
  if function.is_a?(Application)
    @fuse ||= function.function.fusion(function.argument, argument)
    return @fuse if @fuse
  end

  @fuse ||= function.fusion(argument)
end

#normalizeObject



59
60
61
62
63
64
65
66
67
68
69
70
71
72
# File 'lib/dhall/normalize.rb', line 59

def normalize
  return fuse.normalize if fuse

  normalized = super
  return normalized.fuse if normalized.fuse

  if normalized.function.is_a?(BuiltinFunction) ||
     normalized.function.is_a?(Function) ||
     normalized.function.is_a?(RecordSelection)
    return normalized.function.call(normalized.argument)
  end

  normalized
end