Class: Kumi::KernelRegistry
- Inherits:
-
Object
- Object
- Kumi::KernelRegistry
- 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
- #identity(kernel_id, dtype) ⇒ Object
-
#impl_for(kernel_id) ⇒ Object
Late-bind the Ruby implementation Returns implementation structure for the kernel.
-
#initialize(entries) ⇒ KernelRegistry
constructor
A new instance of KernelRegistry.
- #pick(fn) ⇒ Object
- #registry_ref ⇒ Object
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_ruby ⇒ Object
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_ref ⇒ Object
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 |