Class: Kumi::KernelRegistry

Inherits:
Object
  • Object
show all
Defined in:
lib/kumi/kernel_registry.rb

Defined Under Namespace

Classes: Entry

Constant Summary collapse

KERNEL_DIRS =
{
  ruby: "data/kernels/ruby"
}

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(entries) ⇒ KernelRegistry

Returns a new instance of KernelRegistry.



23
24
25
26
27
28
# File 'lib/kumi/kernel_registry.rb', line 23

def initialize(entries)
  @by_fn = Hash.new { |h, k| h[k] = [] }
  @by_id = {}
  entries.each { |e| (@by_fn[e.fn] << e) && (@by_id[e.id] = e) }
  @by_fn.each { |fn, arr| raise "multiple kernels for #{fn}" if arr.size > 1 }
end

Class Method Details

.load_dir(dir) ⇒ Object



16
17
18
19
20
21
# File 'lib/kumi/kernel_registry.rb', line 16

def self.load_dir(dir)
  files = Dir.glob(File.join(dir, "**", "*.y{a,}ml")).sort
  entries = files.flat_map { |p| (YAML.load_file(p) || {}).fetch("kernels", []) }
                 .map { |h| Entry.new(id: h["id"], fn: h["fn"], impl: h["impl"], identity: h["identity"]) }
  new(entries)
end

.load_rubyObject



12
13
14
# File 'lib/kumi/kernel_registry.rb', line 12

def self.load_ruby
  load_dir(KERNEL_DIRS[:ruby])
end

Instance Method Details

#identity(kernel_id, dtype) ⇒ Object



39
40
41
42
43
44
# File 'lib/kumi/kernel_registry.rb', line 39

def identity(kernel_id, dtype)
  e = @by_id[kernel_id] or raise "unknown kernel id #{kernel_id}"
  identity_map = e.identity or raise "no identity map for #{kernel_id}"

  (identity_map[dtype.to_s] || identity_map["any"]) or raise "no identity with dtype `#{dtype}` for #{kernel_id}"
end

#impl_for(kernel_id) ⇒ Object

Late-bind the Ruby implementation Returns implementation structure for the kernel



48
49
50
51
# File 'lib/kumi/kernel_registry.rb', line 48

def impl_for(kernel_id)
  e = @by_id[kernel_id] or raise "unknown kernel id #{kernel_id}"
  e.impl
end

#pick(fn) ⇒ Object



30
31
32
# File 'lib/kumi/kernel_registry.rb', line 30

def pick(fn)
  (@by_fn[fn]&.first || raise("no kernel for #{fn}")).id
end

#registry_refObject



34
35
36
37
# File 'lib/kumi/kernel_registry.rb', line 34

def registry_ref
  stable = { kernels: @by_id.values.map { |e| { "id" => e.id, "fn" => e.fn, "impl" => e.impl } }.sort_by { _1["id"] } }
  "sha256:#{Digest::SHA256.hexdigest(JSON.generate(stable))}"
end