Module: Trailblazer::Activity::DSL::Linear::Compiler
- Defined in:
- lib/trailblazer/activity/dsl/linear/compiler.rb
Overview
Compile a Schema by computing implementations and intermediate from a Sequence.
Class Method Summary collapse
- .call(sequence, find_stops: method(:find_stop_task_ids), find_start: method(:find_start_task_ids)) ⇒ Object
-
.find_connections(seq_row, strategies, sequence) ⇒ Object
private.
-
.find_start_task_ids(intermediate_wiring) ⇒ Object
The first task in the wiring is the default start task.
-
.find_stop_task_ids(intermediate_wiring) ⇒ Object
Default strategy to find out what’s a stop event is to inspect the TaskRef’s :stop_event.
Class Method Details
.call(sequence, find_stops: method(:find_stop_task_ids), find_start: method(:find_start_task_ids)) ⇒ Object
19 20 21 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/trailblazer/activity/dsl/linear/compiler.rb', line 19 def call(sequence, find_stops: method(:find_stop_task_ids), find_start: method(:find_start_task_ids)) _implementations, intermediate_wiring = sequence.inject([[], []]) do |(implementations, intermediates), seq_row| magnetic_to, task, connections, data = seq_row id = data[:id] # execute all {Search}s for one sequence row. connections = find_connections(seq_row, connections, sequence) # FIXME: {:extensions} should be initialized implementations += [[id, Schema::Implementation::Task(task, connections.collect { |output, _| output }, data[:extensions] || []) ]] intermediates += [ [ Schema::Intermediate::TaskRef(id, data), # Compute outputs. connections.collect { |output, target_id| Schema::Intermediate::Out(output.semantic, target_id) } ] ] [implementations, intermediates] end start_task_ids = find_start.(intermediate_wiring) stop_task_refs = find_stops.(intermediate_wiring) intermediate = Schema::Intermediate.new(Hash[intermediate_wiring], stop_task_refs, start_task_ids) implementation = Hash[_implementations] Schema::Intermediate.(intermediate, implementation) # implemented in the generic {trailblazer-activity} gem. end |
.find_connections(seq_row, strategies, sequence) ⇒ Object
private
53 54 55 56 57 58 59 60 61 62 63 64 65 |
# File 'lib/trailblazer/activity/dsl/linear/compiler.rb', line 53 def find_connections(seq_row, strategies, sequence) strategies.collect do |search| output, target_seq_row = search.(sequence, seq_row) # invoke the node's "connection search" strategy. target_seq_row = sequence[-1] if target_seq_row.nil? # connect to an End if target unknown. # DISCUSS: make this configurable, maybe? [ output, # implementation target_seq_row[3][:id], # intermediate # FIXME. this sucks. target_seq_row # DISCUSS: needed? ] end.compact end |
.find_start_task_ids(intermediate_wiring) ⇒ Object
The first task in the wiring is the default start task.
15 16 17 |
# File 'lib/trailblazer/activity/dsl/linear/compiler.rb', line 15 def find_start_task_ids(intermediate_wiring) [intermediate_wiring.first.first.id] end |
.find_stop_task_ids(intermediate_wiring) ⇒ Object
Default strategy to find out what’s a stop event is to inspect the TaskRef’s :stop_event.
10 11 12 |
# File 'lib/trailblazer/activity/dsl/linear/compiler.rb', line 10 def find_stop_task_ids(intermediate_wiring) intermediate_wiring.collect { |task_ref, outs| task_ref.data[:stop_event] ? task_ref.id : nil }.compact end |