Beispiel #1
0
        public static IObservable <T> AsObservable <T>(this INotifyDisposable disposable, Func <T> lastValue = null)
        {
            return(Observable.Create <T>(observer =>
            {
                if (disposable.IsDisposed)
                {
                    if (lastValue != null)
                    {
                        observer.OnNext(lastValue());
                    }
                    observer.OnCompleted();
                    return Disposables.Empty;
                }

                var handler = Disposables.Call(() =>
                {
                    if (lastValue != null)
                    {
                        observer.OnNext(lastValue());
                    }
                    observer.OnCompleted();
                });

                disposable.Attach(handler, keepAlive: true);

                return Disposables.Call(() =>
                {
                    disposable.Dettach(handler);
                });
            }));
        }
Beispiel #2
0
        public Task <INotifyDisposable> Lock()
        {
            //if (we are not locked)
            //{
            //    return Task that is already finished
            //} else {
            //    create task completion source, so we can return the token later
            //        and return the task
            //}

            lock (_mutex)
            {
                var token = Disposables.Call(Release);

                if (_currentToken == null)
                {
                    _currentToken = token;
                    return(_currentToken.ToTask());
                }
                else
                {
                    var drt = token.ToDeferredTask();
                    _requests.Enqueue(drt);
                    return(drt.Task);
                }
            }
        }
Beispiel #3
0
        public static C AllDisposedBy <C>(this C children, INotifyDisposable disposer)
            where C : IEnumerable <IDisposable>
        {
            disposer.AttachMany(children);

            return(children);
        }
Beispiel #4
0
 internal AttachObject(LayoutGroup relativeObj, INotifyDisposable parent, int index, AttachMode mode = AttachMode.None)
 {
     _relativeObj      = relativeObj;
     _parent           = parent;
     _index            = index;
     _mode             = mode;
     _parent.Disposed += OnDisposed;
 }
Beispiel #5
0
        public static INotifyDisposable WhenDisposed(this INotifyDisposable source, Action action)
        {
            var call = Disposables.Call(action);

            source.Attach(call, keepAlive: true);

            return(source);
        }
        public static T DisposedBy <T>(this T source, INotifyDisposable owner)
            where T : IDisposable
        {
            owner.Disposing += (s, e) =>
            {
                source.Dispose();
            };

            return(source);
        }
Beispiel #7
0
        public static T DisposedBy <T>(this T child, INotifyDisposable disposer)
            where T : IDisposable
        {
            if (child is Task)
            {
                throw new ArgumentException("Can not register Task for late disposal", nameof(child));
            }

            disposer.Attach(child);

            return(child);
        }
Beispiel #8
0
 public void Dispose()
 {
     if (_parent != null)
     {
         _parent.Disposed -= OnDisposed;
     }
     if (_relativeObj != null)
     {
         _relativeObj.AttachObj = null;
     }
     _relativeObj = null;
     _parent      = null;
 }
Beispiel #9
0
        internal void Release()
        {
            //if there are pending reuqests,
            //take the next request task and complete it with a new token

            lock (_mutex)
            {
                if (_requests.Any())
                {
                    var drt = _requests.Dequeue();
                    _currentToken = drt.Result;
                    drt.Complete();
                }
                else
                {
                    _currentToken = null;
                }
            }
        }
Beispiel #10
0
        public static IObservable <T> CompletedBy <T>(this IObservable <T> source, INotifyDisposable disposable)
        {
            var completer = disposable.AsObservable <bool>(() => true);

            return(source.TakeUntil(completer));
        }
Beispiel #11
0
 public AsyncMutex()
 {
     _currentToken = null;
     _requests     = new Queue <DeferredTask <INotifyDisposable> >();
     _mutex        = new object();
 }
Beispiel #12
0
        public static IObservable <T> PublishAndConnect <T>(this IObservable <T> source, INotifyDisposable owner)
        {
            var res = source.Publish();

            res.Connect()
            .DisposedBy(owner);

            return(res);
        }