github fedeAlterio/SignalsDotnet v3.4.2

2 hours ago

Time Operators

Use Signal.Now to treat time as a reactive variable.

var current = DateTime.Now;

var s = Signal
    .ComputedObservable(() => Signal.Now > current + TimeSpan.FromSeconds(1))
    .Subscribe(Console.WriteLine);

The observable above will emit false immediately, and true after one second.
SignalClock is the abstraction of "reactive time variables", and its derived from a TimeProvider

Derived operators:

public static partial class Signal
{
    public static SignalClock Now => SignalClock.System;

    public static SignalClock ToSignalClock(this TimeProvider timeProvider) => new(timeProvider);

    public static IReadOnlySignal<ChangeStamp<T>> Stamped<T>(Func<T> expression, SignalClock clock = default, ReadonlySignalConfigurationDelegate<ChangeStamp<T>>? configuration = null)
        => ComputedSignalFactory.Default.Stamped(expression, clock, configuration);

    public static IReadOnlySignal<ChangeStamp<T>> Stamped<T>(this IReadOnlySignal<T> source, SignalClock clock = default, ReadonlySignalConfigurationDelegate<ChangeStamp<T>>? configuration = null)
        => ComputedSignalFactory.Default.Stamped(() => source.Value, clock, configuration);

    public static IReadOnlySignal<DateTimeOffset> ChangedAt<T>(Func<T> expression, SignalClock clock = default)
        => ComputedSignalFactory.Default.ChangedAt(expression, clock);

    public static IReadOnlySignal<DateTimeOffset> ChangedAt<T>(this IReadOnlySignal<T> source, SignalClock clock = default)
        => ComputedSignalFactory.Default.ChangedAt(() => source.Value, clock);

    public static IReadOnlySignal<bool> HeldFor(Func<bool> condition, TimeSpan duration, SignalClock clock = default)
        => ComputedSignalFactory.Default.HeldFor(condition, duration, clock);

    public static IReadOnlySignal<bool> HeldFor(this IReadOnlySignal<bool> condition, TimeSpan duration, SignalClock clock = default)
        => ComputedSignalFactory.Default.HeldFor(() => condition.Value, duration, clock);

    public static IReadOnlySignal<bool> TrueWithin(Func<bool> condition, TimeSpan duration, SignalClock clock = default)
        => ComputedSignalFactory.Default.TrueWithin(condition, duration, clock);

    public static IReadOnlySignal<bool> TrueWithin(this IReadOnlySignal<bool> condition, TimeSpan duration, SignalClock clock = default)
        => ComputedSignalFactory.Default.TrueWithin(() => condition.Value, duration, clock);

    public static IReadOnlySignal<bool> StableFor<T>(Func<T> expression, TimeSpan duration, SignalClock clock = default)
        => ComputedSignalFactory.Default.StableFor(expression, duration, clock);

    public static IReadOnlySignal<bool> StableFor<T>(this IReadOnlySignal<T> source, TimeSpan duration, SignalClock clock = default)
        => ComputedSignalFactory.Default.StableFor(() => source.Value, duration, clock);

    public static IReadOnlySignal<DateTimeOffset?> TrueSince(Func<bool> condition, SignalClock clock = default)
        => ComputedSignalFactory.Default.TrueSince(condition, clock);

    public static IReadOnlySignal<DateTimeOffset?> TrueSince(this IReadOnlySignal<bool> condition, SignalClock clock = default)
        => ComputedSignalFactory.Default.TrueSince(() => condition.Value, clock);

    public static IReadOnlySignal<DateTimeOffset?> Rising(Func<bool> condition, SignalClock clock = default)
        => ComputedSignalFactory.Default.Rising(condition, clock);

    public static IReadOnlySignal<DateTimeOffset?> Rising(this IReadOnlySignal<bool> condition, SignalClock clock = default)
        => ComputedSignalFactory.Default.Rising(() => condition.Value, clock);

    public static IReadOnlySignal<DateTimeOffset?> Falling(Func<bool> condition, SignalClock clock = default)
        => ComputedSignalFactory.Default.Falling(condition, clock);

    public static IReadOnlySignal<DateTimeOffset?> Falling(this IReadOnlySignal<bool> condition, SignalClock clock = default)
        => ComputedSignalFactory.Default.Falling(() => condition.Value, clock);
}

Don't miss a new SignalsDotnet release

NewReleases is sending notifications on new releases.