Построитель рабочих процессов F# для Rx

Здесь есть хороший конструктор рабочих процессов F # для Rx:

http://blogs.msdn.com/b/dsyme/archive/2011/05/30/nice-f-syntax-for-rx-reactive-extensions.aspx

Я пытался реализовать использование для рабочего процесса, но продолжаю биться головой о стену. Может быть, здесь слишком поздно.

Как бы это создать?

type RxBuilder () =

    // ...

    member this.Using (disposable, f) =
        Observable.Using(???)

Заранее спасибо.


person Bent Rasmussen    schedule 17.06.2012    source источник


Ответы (1)


Во-первых, исходный код необходимо немного обновить для последних выпусков Rx. А именно, For и While должны быть реализованы как:

member this.For (xs : 'a seq, f: 'a -> 'b IObservable) =
    Observable.SelectMany(xs.ToObservable(), new Func<_, IObservable<_>>(f)) 

member this.While (f, xs: 'a IObservable) =
    Observable.TakeWhile (xs, new Func<_,bool>(fun _ -> f()))

Затем, основываясь на этом, вы можете использовать следующее для реализации Using:

member this.Using(res:#IDisposable, body) = this.TryFinally(body res, fun () -> match res with null -> () | disp -> disp.Dispose())
person yamen    schedule 18.06.2012
comment
Хороший! Мне нравится обозначение ограничения. Похоже, стоит присмотреться к fsharpx. - person Bent Rasmussen; 18.06.2012
comment
Моя реализация For на самом деле выглядела так: член this.For (xs : 'a IObservable, f: 'a -> 'b IObservable) : 'b IObservable = xs.SelectMany(f). Еще не проверял. - person Bent Rasmussen; 18.06.2012
comment
Это в основном одно и то же, я просто не использовал формат метода расширения из соображений стиля (чтобы соответствовать другим реализациям) и аргументы явного типа, чтобы убедиться, что все работает как положено. - person yamen; 18.06.2012