/// <summary>
        /// Run basic example with option to cancel
        /// </summary>
        /// <param name="token">Valid CancellationToken</param>
        /// <returns></returns>
        public static async Task RunBasicExample(CancellationToken token)
        {
            await foreach (var item in RangeAsync(1, 90, 99, token))
            {
                if (token.IsCancellationRequested)
                {
                    token.ThrowIfCancellationRequested();
                }

                if (item > 100)
                {
                    throw new Exception("Well now");
                }
                OnIterateEvent?.Invoke(item);
            }
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="originalFile">File to copy</param>
        /// <param name="outputFile">File to copy too</param>
        /// <param name="delay">Milliseconds to delay to simulate a large file</param>
        /// <param name="token">cancellation token to permit cancelling this operation</param>
        /// <returns>Success</returns>
        /// <remarks>
        /// Exception handling is done at client level
        /// </remarks>
        public static async Task <bool> CopyFileTask(string originalFile, string outputFile, int delay, CancellationToken token)
        {
            int lineNumber = 0;

            using (var inputStream = File.OpenRead(originalFile))
            {
                using (var inputReader = new StreamReader(inputStream))
                {
                    using (var outputWriter = File.AppendText(outputFile))
                    {
                        var currentLine = await inputReader.ReadLineAsync();

                        await outputWriter.WriteLineAsync(currentLine);

                        if (delay > 0)
                        {
                            await Task.Delay(delay, token);
                        }

                        while (null != currentLine)
                        {
                            lineNumber += 1;
                            await outputWriter.WriteLineAsync(currentLine);

                            currentLine = await inputReader.ReadLineAsync();

                            OnIterateEvent?.Invoke(lineNumber);
                            if (token.IsCancellationRequested)
                            {
                                token.ThrowIfCancellationRequested();
                            }

                            if (delay > 0)
                            {
                                await Task.Delay(delay, token);
                            }
                        }
                    }
                }
            }

            return(true);
        }