fsleep function

Future<void> fsleep(
  1. dynamic cancellationTokenOrExecutionContext,
  2. Duration? duration
)

Provide a "sleeping" Promise that completes via timeout or cancellationToken @param cancellationToken The cancellation token to cancel "sleeping" @param ms Timeout delay in milliseconds. If ommited, the "sleeping" Promise will sleep infinitely and wait for cancellation token activation

Without cancellation token

await fsleep(FCancellationToken.dummy, 25); // Suspend execution for 25 milliseconds

Usage with FCancellationToken and timeout

final cancellationTokenSource = FCancellationTokenSourceManual();
...
await fsleep(cancellationTokenSource.token, 25); // Suspend execution for 25 milliseconds or cancel if cancellationTokenSource activates

Usage with FCancellationToken only

final cancellationTokenSource = FCancellationTokenSourceManual();
...
await fsleep(cancellationTokenSource.token); // Suspend infinitely while cancellationTokenSource activates

Usage with FExecutionContext only

final FExecutionContext executionContext = ...;
...
await fsleep(executionContext); // Cancellation token will extracted from execution context

Implementation

Future<void> fsleep(
  dynamic cancellationTokenOrExecutionContext,
  Duration? duration,
) async {
  FCancellationToken cancellationToken;
  if (cancellationTokenOrExecutionContext is FExecutionContext) {
    cancellationToken =
        FCancellationExecutionContext.of(cancellationTokenOrExecutionContext)
            .cancellationToken;
  } else if (cancellationTokenOrExecutionContext is FCancellationToken) {
    cancellationToken = cancellationTokenOrExecutionContext;
  } else {
    throw FExceptionArgument(
      "Unexpected overloading",
      "cancellationTokenOrExecutionContext",
    );
  }

  final Completer<void> completer = Completer<void>.sync();

  Timer? timer;

  void cancelCallback(FCancellationException ex) {
    cancellationToken.removeCancelListener(cancelCallback);
    if (timer != null) {
      timer!.cancel();
      timer = null;
    }
    completer.completeError(ex);
  }

  void timeoutCallback() {
    cancellationToken.removeCancelListener(cancelCallback);
    timer = null;
    completer.complete();
  }

  cancellationToken.addCancelListener(cancelCallback);
  if (duration != null) {
    timer = Timer(duration, timeoutCallback);
  }

  return completer.future;
}