populateAsync<R> method

Future<R?> populateAsync<R>(
  1. Iterable<T> entries, {
  2. GraphWalkNodeProviderAsync<T>? nodeProvider,
  3. GraphWalkOutputsProviderAsync<T>? inputsProvider,
  4. GraphWalkOutputsProviderAsync<T>? outputsProvider,
  5. GraphWalkNodeProcessorAsync<T, R>? process,
  6. int maxExpansion = 3,
  7. bool bfs = false,
})

Implementation

Future<R?> populateAsync<R>(
  Iterable<T> entries, {
  GraphWalkNodeProviderAsync<T>? nodeProvider,
  GraphWalkOutputsProviderAsync<T>? inputsProvider,
  GraphWalkOutputsProviderAsync<T>? outputsProvider,
  GraphWalkNodeProcessorAsync<T, R>? process,
  int maxExpansion = 3,
  bool bfs = false,
}) async {
  nodeProvider ??= (s, e) => this.node(e);
  inputsProvider ??= (s, e) => [];
  outputsProvider ??= (s, e) => [];

  var graphWalker = GraphWalker<T>(maxExpansion: maxExpansion, bfs: bfs);

  return graphWalker.walkAsync<R>(
    entries,
    nodeProvider: nodeProvider,
    outputsProvider: outputsProvider,
    process: (step) async {
      var node = step.node;
      var nodeValue = node.value;

      var outputs = await outputsProvider!(step, nodeValue) ?? [];
      for (var child in outputs) {
        node.addOutput(child);
      }

      var inputs = await inputsProvider!(step, nodeValue) ?? [];
      for (var dep in inputs) {
        node.addInput(dep);
      }

      if (process == null) {
        return null;
      }

      var ret = await process(step);
      return ret;
    },
  );
}