rknell / dart_queue

A library to easily handle sequential queueing of futures in dart.
MIT License
57 stars 17 forks source link

identifier to each queue so that the same algorithm is rerun while in process #9

Closed kevin4dhd closed 2 years ago

kevin4dhd commented 2 years ago

Hello, I am implementing this library with the video thumbnail, but I have a problem, which is that sometimes the same element is called 2 times, causing an unnecessary queue to be generated, so I would like for example:

kevin4dhd commented 2 years ago

add the first queue final resultOne = await queue.add(code: "001",() async { await Future.delayed(Duration(seconds: 10)); return "Finish one"; });

Then comes the second queue final resultTwo = await queue.add(code: "002",() async { await Future.delayed(Duration(seconds: 10)); return "Finish Two"; });

Then comes a third queue with the same code as the first, so I would like that when the first one ends, the third queue is also executed. final resultThree= await queue.add(code: "001",() async { //returns the same result because 001 is already running await Future.delayed(Duration(seconds: 10)); //this is no longer running return "Finish one"; });

rknell commented 2 years ago

Hey @kevin4dhd

While a native solution might be added at some point, I would just extend the queue class with something like this:

class UniqueQueue<T> extends Queue {
  var _uniqueTracker = <dynamic>{};

  addUnique(dynamic identifier, Future<T> Function() closure) {
    if (_uniqueTracker.contains(identifier) == false) {
      add(closure);
      _uniqueTracker.add(identifier);
    }
  }
}

then replace your queue object with UniqueQueue and call addUnique.

Going to close with this for now, but if there is something else feel free to keep responding.