ProcrastiN8 0.1.1-prerelease0001

This is a prerelease version of ProcrastiN8.
There is a newer prerelease version of this package available.
See the version list below for details.
dotnet add package ProcrastiN8 --version 0.1.1-prerelease0001
                    
NuGet\Install-Package ProcrastiN8 -Version 0.1.1-prerelease0001
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="ProcrastiN8" Version="0.1.1-prerelease0001" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="ProcrastiN8" Version="0.1.1-prerelease0001" />
                    
Directory.Packages.props
<PackageReference Include="ProcrastiN8" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add ProcrastiN8 --version 0.1.1-prerelease0001
                    
#r "nuget: ProcrastiN8, 0.1.1-prerelease0001"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package ProcrastiN8@0.1.1-prerelease0001
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=ProcrastiN8&version=0.1.1-prerelease0001&prerelease
                    
Install as a Cake Addin
#tool nuget:?package=ProcrastiN8&version=0.1.1-prerelease0001&prerelease
                    
Install as a Cake Tool

🐒 ProcrastiN8

Because shipping is optional.

ProcrastiN8 is a C#/.NET utility library for developers who embrace the art of strategic procrastination. Whether you're stalling creatively or just simulating productivity, this package provides humorous, overengineered, yet technically valid tools to help you do less β€” better β€” later.


✨ Features

  • Eventually.Do(...): Execute tasks... eventually. Now with excuses and jitter.
  • FakeProgress: Simulate infinite progress to impress stakeholders.
  • InfiniteSpinner: A CPU-hungry animation loop of meaningless motion.
  • BusyWaitSimulator: Burn cycles under the guise of being very busy.
  • RetryUntilCancelled: Retries operations forever (or until someone gives up).
  • QuantumEntanglementRegistry: Link async operations through questionable physics metaphors.
  • ExcuseGenerator: Generate plausible (or implausible) reasons for delay.
  • CommentaryService: Structured procrastination commentary, fully injectable.
  • DelayStrategy: Pluggable, testable delay logic (coming soon).
  • ProcrastinationMetrics: Track and analyze your stalling performance (coming soon).
  • [Todo] attributes and schedulers that do absolutely nothing.
  • Randomized exception injectors β€” because chaos is healthy.
  • Extensions for generating excuses, procrastinating DateTimes, and more.
  • Support for structured logging (without mandatory dependencies).
  • Playful, absurd, but built with real care.

πŸ§™β€β™‚οΈ Getting Started

πŸ”§ Installation

dotnet add package ProcrastiN8 --prerelease
# Because release-readiness is a social construct.

Or via the NuGet Package Manager:

Install-Package ProcrastiN8 -Prerelease
# Because final releases are for the overly decisive.

🐌 Usage Example

using ProcrastiN8.LazyTasks;

await Eventually.Do(async () =>
{
    Console.WriteLine("Actually doing something now...");
});

Expected output:

[Eventually] Thinking about it... Might do it in 17.3s.
[Eventually] Reason for delay: Blocked by a third-party library.
[Eventually] Just five more minutes...
...
[Eventually] Finally did the thing. You're welcome.

πŸ“š API Highlights

Eventually.Do(...)

Task Eventually.Do(
    Func<Task> action,
    TimeSpan? within = null,
    string? excuse = null,
    IProcrastiLogger? logger = null,
    CancellationToken cancellationToken = default)
  • within: Maximum delay before action is executed (default: 30s).
  • excuse: Optional string to justify the delay (see ExcuseGenerator).
  • logger: Optional logger (custom IProcrastiLogger interface).
  • Logs procrastination chatter while stalling.

RetryUntilCancelled

Task RetryUntilCancelled.Do(
    Func<Task> action,
    IProcrastiLogger? logger = null,
    IExcuseProvider? excuseProvider = null,
    IRetryStrategy? retryStrategy = null,
    CancellationToken cancellationToken = default)
  • Retries the action until cancellation or despair.
  • Fully injectable for testability (excuses, delays, logging).

QuantumEntanglementRegistry<T>

public class QuantumEntanglementRegistry<T>
  • Entangle and collapse async operations in ways that defy reason.
  • Thread-safe, for those who pretend it matters.

FakeProgress, InfiniteSpinner, BusyWaitSimulator

  • Simulate the appearance of productivity with endless progress, spinning, or busy-waiting.
  • All support cancellation and logging.

πŸ§ͺ Testing Standards

ProcrastiN8 is built for testability and over-abstraction:

  • Unit tests: xUnit
  • Mocks: NSubstitute (no exceptions)
  • Assertions: AwesomeAssertions (for expressive, readable tests)
  • Delays/timing: Always injectable/faked
  • Logging: Always via IProcrastiLogger or test double
  • Absurdity: Every test must acknowledge the futility of its own existence

Example:

[Fact]
public async Task Eventually_Should_Delay_Execution_And_Log_Excuse()
{
    var logger = Substitute.For<IProcrastiLogger>();
    var called = false;

    await Eventually.Do(() =>
    {
        called = true;
        return Task.CompletedTask;
    }, excuse: "Just five more minutes", logger: logger);

    called.Should().BeTrue("eventual execution is still execution");
    await logger.Received().Info(Arg.Is<string>(m => m.Contains("Just five more minutes")));
}

πŸ”„ New & Experimental

Feature Description
InfiniteSpinner.Start() Loops endlessly to simulate doing something. CPU usage is part of the fun.
BusyWaitSimulator.Run() Consumes time with zero productivity.
RetryUntilCancelled Retries until you cancel or give in. No exponential backoff β€” just hope.
QuantumEntanglementRegistry Links promises. Collapse one and see what happens. No guarantees.
FakeProgress.Start() Loops endlessly at ~98%. Adds legitimacy to indecision.
DelayStrategy Pluggable, testable delay logic (coming soon).
ProcrastinationMetrics Track and analyze your stalling performance (coming soon).

πŸͺ΅ Logging Support

ProcrastiN8 uses a lightweight, pluggable logger abstraction:

public interface IProcrastiLogger
{
    void Info(string message);
    void Debug(string message);
    void Error(string message, Exception? ex = null);
}

You can use your own implementation or adapt to Microsoft.Extensions.Logging:

var logger = new MELAdapter(myILogger); // from ProcrastiN8.Adapters.MEL
await Eventually.Do(action, logger: logger);

πŸͺ„ Roadmap

  • QuantumEntanglementRegistry for chaotic promise behavior
  • FakeProgress, InfiniteSpinner, and BusyWaitSimulator
  • RetryUntilCancelled with structured commentary
  • Robust, over-abstracted test suite (NSubstitute, AwesomeAssertions)
  • DelayStrategy support (e.g., exponential backoff with excuses)
  • ProcrastinationMetrics (e.g. average delay, skipped deadlines)
  • NuGet sub-packages: ProcrastiN8.Logging.MEL, ProcrastiN8.Tracing
  • Integration with GPT for dynamically generated excuses
  • Remove --pre-release from install instructions (ETA: when the universe reaches heat death)

🎯 Why?

β€œDon't put off until tomorrow what you can avoid indefinitely with style.” β€” someone, probably

This library is both satire and a gentle commentary on developer behavior. But it’s also built with care, type safety, testability, and extensibility in mind.


πŸ§ͺ Requirements

  • .NET 6.0 or higher
  • No runtime dependencies
  • Logging is optional and pluggable

πŸ‘¨β€πŸ”§ Author

Made by @veggerby β€” overengineer, software architect, and semi-professional excuse generator.


βš–οΈ License

MIT. Free to use, fork, delay, or completely ignore.


🧠 Bonus Tip

var bar = new FakeProgress("Deploying to Production");
bar.Start();
// Just sit back. No one will question a 98% loading bar.

Or go quantum:

var registry = new QuantumEntanglementRegistry<string>();
registry.Entangle(someQuantumPromise);
await registry.CollapseOneAsync(); // Reality may vary

β˜• If you actually read this far, you're probably procrastinating something important. You're in good company.

Product Compatible and additional computed target framework versions.
.NET net6.0 is compatible.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net7.0 was computed.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 is compatible.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 is compatible.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 was computed.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.
  • net6.0

    • No dependencies.
  • net8.0

    • No dependencies.
  • net9.0

    • No dependencies.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
0.1.1-prerelease0045 144 8/24/2025
0.1.1-prerelease0037 142 8/24/2025
0.1.1-prerelease0019 94 7/30/2025
0.1.1-prerelease0018 90 7/29/2025
0.1.1-prerelease0017 91 7/29/2025
0.1.1-prerelease0016 91 7/28/2025
0.1.1-prerelease0015 91 7/28/2025
0.1.1-prerelease0011 95 7/28/2025
0.1.1-prerelease0009 95 7/28/2025
0.1.1-prerelease0008 89 7/28/2025
0.1.1-prerelease0001 93 7/27/2025
0.1.0-prerelease0001 509 7/22/2025

Built by procrastination, driven by satire.