public void AwaitOnCompleted <TAwaiter, TStateMachine>(ref TAwaiter awaiter, ref TStateMachine stateMachine) where TAwaiter : INotifyCompletion where TStateMachine : IAsyncStateMachine { switch (awaiter) { case IBreakable breakableAwaiter: _inner = breakableAwaiter; awaiter.OnCompleted(_continuation); break; case SelfScopeAwaiter selfScopeAwaiter: selfScopeAwaiter.Value = Task.Scope; awaiter.OnCompleted(_continuation); break; case SelfDisposeAwaiter selfDisposeAwaiter: selfDisposeAwaiter.Value = Task._Dispose; awaiter.OnCompleted(_continuation); break; default: Asr.Fail("passed unbreakable awaiter"); break; } }
public void GetOrFail(out T value) { if (!TryGet(out value)) { Asr.Fail($"Option<{typeof(T).Name}> has no value"); } }
public T GetOrFail() { if (!TryGet(out var value)) { Asr.Fail($"Option<{typeof(T).Name}> has no value"); } return(value); }
public void Unsubscribe(Action dispose) { if (Disposed || Disposing) { Asr.Fail("Cannot unsubscribe during or after disposal"); return; } var any = _stack.Remove(dispose); Asr.IsTrue(any, "Delegate not found: make sure it's the same which was passed to OnDispose"); }
public static void Deregister(TTarget target) { var hash = _generator.GetId(target, out var firstTime); Asr.IsFalse(firstTime); if (_Registry.TryGetValue(hash, out var t)) { _Registry[hash].Deregistered = true; } else { Asr.Fail("No such key"); } }
public static void Deregister(TTarget target) { var hash = _generator.GetId(target, out var firstTime); Asr.IsFalse(firstTime); if (_eventRegistry.TryGetValue(hash, out var t)) { t.OnDeregister?.Invoke(); } else { Asr.Fail("No such key"); } _eventRegistry.Remove(hash); }
public void Subscribe(Action callback, IScope scope) { if (_completed) { Asr.Fail("Tried to subscribe to ISub which is completed"); return; } Asr.IsFalse(scope.Disposed); var node = _next.AddLast(callback); scope.Subscribe(Remove); void Remove() { node.List?.Remove(node); } }
public void Publish() { if (_completed) { Asr.Fail("Tried to publish Next to IPub which is completed"); return; } Asr.IsTrue(_current.Count == 0); Swap(); Run(_current, _next); void Swap() { var tmp = _current; _current = _next; _next = tmp; } }