22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
# File 'lib/igniter/extensions/contracts/language/formula_pack.rb', line 22
def formula_keyword
Igniter::Contracts::DslKeyword.new(:formula) do |name, builder:, trace: nil, &block|
raise ArgumentError, "formula :#{name} requires a block" unless block
trace_name = (trace || :"#{name}_trace").to_sym
definition = Definition.new(name: name)
definition.instance_eval(&block)
definition.validate!
builder.add_operation(
kind: :compute,
name: trace_name,
depends_on: definition.dependencies,
callable: lambda do |**values|
definition.resolve(values)
end
)
builder.add_operation(
kind: :compute,
name: name,
depends_on: [trace_name],
callable: lambda do |**values|
values.fetch(trace_name).fetch(:value)
end
)
end
end
|