Module: Igniter::Extensions::Contracts::Language::ScalePack

Defined in:
lib/igniter/extensions/contracts/language/scale_pack.rb

Defined Under Namespace

Classes: Definition

Class Method Summary collapse

Class Method Details

.install_into(kernel) ⇒ Object



17
18
19
20
# File 'lib/igniter/extensions/contracts/language/scale_pack.rb', line 17

def install_into(kernel)
  kernel.dsl_keywords.register(:scale, scale_keyword)
  kernel
end

.manifestObject



10
11
12
13
14
15
# File 'lib/igniter/extensions/contracts/language/scale_pack.rb', line 10

def manifest
  Igniter::Contracts::PackManifest.new(
    name: :extensions_language_scale,
    registry_contracts: [Igniter::Contracts::PackManifest.dsl_keyword(:scale)]
  )
end

.scale_keywordObject



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
49
# File 'lib/igniter/extensions/contracts/language/scale_pack.rb', line 22

def scale_keyword
  Igniter::Contracts::DslKeyword.new(:scale) do |name, from:, builder:, trace: nil, &block|
    raise ArgumentError, "scale :#{name} requires a block" unless block

    source_name = from.to_sym
    trace_name = (trace || :"#{name}_trace").to_sym
    definition = Definition.new(name: name, source_name: source_name)
    definition.instance_eval(&block)
    definition.validate!

    builder.add_operation(
      kind: :compute,
      name: trace_name,
      depends_on: [source_name],
      callable: lambda do |**values|
        definition.resolve(values.fetch(source_name))
      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