@@ -5,29 +5,25 @@ module Runtime
55 class Filter < Struct . new ( :read_name , :write_name , keyword_init : true ) # We *could* allow more options here.
66 # This Node represents one step in the input/output pipe,
77 # one filter.
8- def self . build_node ( args_for_provider :, id :, **options )
9- provider_with_step_interface = args_for_provider [ 0 ]
10- options_for_provider_node = args_for_provider [ 2 ] || { } # FIXME: change public API of build_node.
8+ def self . build_node ( id :, **options )
9+ circuit = build_circuit ( **options )
1110
1211 options_for_filter = options . slice ( *members ) # extract :read_name, :write_name.
1312
13+ create_node_for ( circuit , id : id , **options_for_filter )
14+ end
15+
16+ def self . build_circuit ( args_for_step_build :, **options )
17+ provider_arg , provider_options = args_for_step_build
18+
1419 provider_node = Activity ::Step . build (
15- provider_with_step_interface ,
16- **options_for_provider_node , # DISCUSS: what's this?
20+ provider_arg ,
21+ **provider_options , # e.g. {exec_context: Filter.new}
1722 binary : false
1823 )
1924
20- steps = [ # FIXME: better defaulting, please, not very obvious.
21- [ :invoke_provider , node : provider_node ] ,
22- [ :add_value_to_aggregate , :add_value_to_aggregate , Circuit ::Task ::Adapter ::LibInterface ::InstanceMethod ] ,
23- ]
24-
25- pipe = build_circuit ( steps , **options )
25+ steps = rows_for_build ( provider_node )
2626
27- create_node_for ( pipe , id : id , **options_for_filter )
28- end
29-
30- def self . build_circuit ( steps , **)
3127 Circuit ::Builder . Circuit ( *steps )
3228 end
3329
@@ -38,17 +34,26 @@ def self.create_node_for(circuit, id:, **options_for_filter)
3834 return Circuit ::Node ::MergeToCircuitOptions [ id , circuit , Circuit ::Processor , exec_context : filter_exec_context ]
3935 end
4036
37+ # FIXME: can we reuse nodes?
38+ def self . rows_for_build ( provider_node )
39+ [
40+ [ :invoke_provider , node : provider_node ] ,
41+ [ :add_value_to_aggregate , :add_value_to_aggregate , Circuit ::Task ::Adapter ::LibInterface ::InstanceMethod ] ,
42+ ]
43+ end
44+
4145 module Out
4246
4347 end
4448
4549 class Conditioned < Filter
46- def self . build_circuit ( *)
47- provider_with_step_interface = :read_variable_from_application_ctx
48-
49- provider_node = Activity ::Step . build ( provider_with_step_interface , binary : false )
50+ def self . build_circuit ( **options )
51+ super ( **options , args_for_step_build : [ :read_variable_from_application_ctx , { } ] ) # the provider is {#read_variable_from_application_ctx}.
52+ end
5053
51- circuit_steps = [
54+ # FIXME: we can reuse most nodes?
55+ def self . rows_for_build ( provider_node )
56+ [
5257 [ :variable_present_in_application_ctx? , :variable_present_in_application_ctx? , Circuit ::Task ::Adapter ::LibInterface ::InstanceMethod ,
5358 connections : Circuit ::Resolver ::Conditional . new ( [ Left ] , nil , :invoke_provider ) ] , # Left means terminate.
5459 [ :invoke_provider , node : provider_node , # extract a value
@@ -59,15 +64,16 @@ def self.build_circuit(*)
5964 connections : Circuit ::Resolver ::Fixed . new ( nil ) # terminus.
6065 ]
6166 ]
62-
63- Circuit ::Builder . Circuit ( *circuit_steps )
6467 end
68+
69+ # TODO: save memory by not creating identical circuits!
70+ # CIRCUIT = build_node(id: :bla)
6571 end
6672
6773 class Defaulted < Filter
68- def self . build_circuit ( * , default_provider :, **options )
74+ def self . build_node ( default_provider : , id :, **options )
6975 # FIXME: playing with "inheritance" here
70- conditioned_circuit = Conditioned . build_circuit
76+ conditioned_circuit = Conditioned . build_circuit ( ** options )
7177
7278 default_provider_node = Activity ::Step . build ( default_provider , binary : false )
7379
@@ -79,7 +85,12 @@ def self.build_circuit(*, default_provider:, **options)
7985 resolver : Circuit ::Resolver ::Fixed . new ( :wrap_value_with_hash ) ,
8086 ]
8187
82- Circuit ::Adds . ( conditioned_circuit , adds_instruction )
88+ circuit = Circuit ::Adds . ( conditioned_circuit , adds_instruction )
89+
90+ # FIXME: redundant.
91+ options_for_filter = options . slice ( *members ) # extract :read_name, :write_name.
92+
93+ create_node_for ( circuit , id : id , **options_for_filter )
8394 end
8495 end
8596
0 commit comments