run method

  1. @override
Future run(
  1. Map<String, dynamic> shared
)
override

Runs the flow for a batch of inputs.

This method follows Python's BatchFlow orchestration pattern exactly:

  1. Calls prep(shared) to get batch parameters
  2. For each batch parameter, calls orch with merged parameters
  3. Returns post(shared, prepResult, null) - no per-item exec result collection

Matches Python's implementation:

def _run(self,shared):
    pr=self.prep(shared) or []
    for bp in pr: self._orch(shared,{**self.params,**bp})
    return self.post(shared,pr,None)

Implementation

@override
/// Runs the flow for a batch of inputs.
///
/// This method follows Python's BatchFlow orchestration pattern exactly:
/// 1. Calls prep(shared) to get batch parameters
/// 2. For each batch parameter, calls orch with merged parameters
/// 3. Returns post(shared, prepResult, null) - no per-item exec result
///    collection
///
/// Matches Python's implementation:
/// ```python
/// def _run(self,shared):
///     pr=self.prep(shared) or []
///     for bp in pr: self._orch(shared,{**self.params,**bp})
///     return self.post(shared,pr,None)
/// ```
Future<dynamic> run(Map<String, dynamic> shared) async {
  // prep should return List<Map<String, dynamic>> (batch param maps)
  final prepResult = await prep(shared);

  for (final batchParams in prepResult) {
    final mergedParams = <String, dynamic>{};
    if (params.isNotEmpty) mergedParams.addAll(params);
    mergedParams.addAll(batchParams);

    // Temporarily set batch item value in shared for node access
    shared['value'] = batchParams['value'];

    // orch should accept params override for this batch item
    await orch(shared, mergedParams);

    // Note: Don't restore original value - let the last processed value
    // remain
  }

  // Python BatchFlow._run returns post(shared, prep_res, None)
  return post(shared, prepResult, null);
}