query method

VoidCallback query(
  1. List<String> path,
  2. TTOnCb cb
)

Read a potentially multi-level deep path from the graph

@param path The path to read @param cb The callback to invoke with results @returns a cleanup function to after done with query

Implementation

VoidCallback query(List<String> path, TTOnCb cb) {
  List<String> lastSouls = [];
  TTValue currentValue;

  updateQuery(TTNode? _, [dynamic __, dynamic ___]) {
    PathData getPathDateList = getPathData(path, _graph);

    List<String> souls = getPathDateList.souls;
    TTValue value = getPathDateList.value;
    bool complete = getPathDateList.complete;

    final diffSetsList = diffSets(lastSouls, souls);

    List<String> added = diffSetsList[0];
    List<String> removed = diffSetsList[1];

    if ((complete && currentValue == null) ||
        (value != null && value != currentValue)) {
      currentValue = value;
      cb(value, path[path.length - 1]);
    }

    for (final soul in added) {
      _requestSoul(soul, updateQuery);
    }

    for (final soul in removed) {
      _unlistenSoul(soul, updateQuery);
    }

    lastSouls = souls;
  }

  updateQuery(null);

  return () {
    for (final soul in lastSouls) {
      _unlistenSoul(soul, updateQuery);
    }
  };
}