populate<R> method

R? populate<R>(
  1. Iterable<T> entries, {
  2. GraphWalkNodeProvider<T>? nodeProvider,
  3. GraphWalkOutputsProvider<T>? inputsProvider,
  4. GraphWalkOutputsProvider<T>? outputsProvider,
  5. GraphWalkNodeProcessor<T, R>? process,
  6. int maxExpansion = 3,
  7. bool bfs = false,
})

Populates this graph with entries.

  • inputsProvider: provides the inputs of an entry.
  • outputsProvider: provides the outputs of an entry.

Implementation

R? populate<R>(
  Iterable<T> entries, {
  GraphWalkNodeProvider<T>? nodeProvider,
  GraphWalkOutputsProvider<T>? inputsProvider,
  GraphWalkOutputsProvider<T>? outputsProvider,
  GraphWalkNodeProcessor<T, R>? process,
  int maxExpansion = 3,
  bool bfs = false,
}) {
  nodeProvider ??= (s, e) => this.node(e);
  inputsProvider ??= (s, e) => [];
  outputsProvider ??= (s, e) => [];

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

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

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

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

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

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