ever<T> function

Worker ever<T>(
  1. RxInterface<T> observable,
  2. WorkerCallback<T> callback, {
  3. dynamic condition,
  4. Duration? debounce,
})

Executes a callback every time the value of observable changes.

Sample:

final count = 0.obs;
Worker worker;

void onInit() {
  worker = ever(count, (value) {
    print('counter changed to: $value');
  }, condition: () => count > 5);
}

Implementation

Worker ever<T>(
  RxInterface<T> observable,
  WorkerCallback<T> callback, {
  dynamic condition,
  Duration? debounce,
}) {
  bool isProcessing = false;

  void listener() {
    if (!_checkCondition(condition)) return;

    if (debounce != null) {
      // Debounce logic
      if (!isProcessing) {
        isProcessing = true;
        Timer(debounce, () {
          callback(observable.value);
          isProcessing = false;
        });
      }
    } else {
      if (!isProcessing) {
        isProcessing = true;
        try {
          callback(observable.value);
        } finally {
          isProcessing = false;
        }
      }
    }
  }

  observable.addListener(listener);

  return Worker(() {
    observable.removeListener(listener);
  });
}