スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

F#入門初級編 第18回 Delegates と Events(6) IObservable

それでは前回に引き続きObservableモジュールのメソッドを紹介していきます。
 
下は何回も出てきている、サンプルコードです。
 
type WhatTimeDidItHappenEventArgs (dateTime : System.DateTime) =
    inherit System.EventArgs()
    member this.DateTime = dateTime
 
type DelegateForPublisherExampWithDelg = 
                    delegate of obj * WhatTimeDidItHappenEventArgs -> unit
 
type PublisherExampWithDelg () =
    let _event1 = 
        new Event< DelegateForPublisherExampWithDelg,WhatTimeDidItHappenEventArgs>()
    member this.SomethingHappen() =
        _event1.Trigger(this,new WhatTimeDidItHappenEventArgs( System.DateTime.Now ))
    [<CLIEvent>]
    member this.Event1 = _event1.Publish
 
let t = new PublisherExampWithDelg();;
let originalEvent = t.Event1
 
なお今回[<CLIEvent>]というアトリビュートがPublish部分についていますが、これはDLL化等して他の.NET言語からこのeventを利用する場合に必要となります。(今回は特に必要ありません。)
 
それでは順次Observableモジュールにあるメソッドを紹介していきます。
 
○Observable.map
これは、付加情報を変換します。
// Signature:
Observable.map : ('T -> 'U) -> IObservable<'T> -> IObservable<'U>
 
例では付加情報はWhatTimeDidItHappenEventArgs型になります。
よってこれから、時間だけを抜き出して新しいIObservable型を作ってみます。
 
let timeEvent = 
    originalEvent 
     |> Observable.map(fun (whatTimeArgs : WhatTimeDidItHappenEventArgs) ->
                        whatTimeArgs.DateTime.TimeOfDay) 
時間を表示する関数を登録して使ってみます。
> timeEvent.Add(fun args -> printfn "triggered time = %A" args);;
val it : unit = ()
> t.SomethingHappen();;
triggered time = 06:44:38.9060260
val it : unit = ()
 
○Observable.choose
 
// Signature:
Observable.choose : ('T -> 'U option) -> IObservable<'T> -> IObservable<'U>
// Usage:
Observable.choose chooser source
 
これは、filterとmapをまとめたようなものです。
 
○Observable.merge
 
// Signature:
Observable.merge : IObservable<'T> -> IObservable<'T> -> IObservable<'T>
// Usage:
Observable.merge source1 source2
 
これは二つのeventを引数に取り、どちらか一方がfireする時、fireする新しいeventを返します。
 
○Observable.pairwise
 
// Signature:
Observable.pairwise : IObservable<'T> -> IObservable<'T * 'T>
 
// Usage:
Observable.pairwise source
 
これは付加情報の形を、(付加情報、付加情報)の形に直します。(どんな時に使うのでしょうか?)
 
○Observable.scan
 
// Signature:
Observable.scan : ('U -> 'T -> 'U) -> 'U -> IObservable<'T> -> IObservable<'U>
 
// Usage:
Observable.scan collector state source
 
これはEventにおけるfold関数のようなものです。
イベントが発火した時刻をリストで保持してみます。
 
let foldTimetEvent = 
    originalEvent 
     |> Observable.scan(fun s (whatTimeArgs : WhatTimeDidItHappenEventArgs) ->
                         (whatTimeArgs.DateTime.TimeOfDay::s)) [] 
 
 
foldTimetEvent.Add(fun args -> printfn "triggered times = %A" args)  
 
使用してみます。
 
> t.SomethingHappen();;
triggered times = [07:59:10.5612280]
val it : unit = ()
> t.SomethingHappen();;
triggered times = [07:59:12.2574085; 07:59:10.5612280]
val it : unit = ()
> t.SomethingHappen();;
triggered times = [07:59:13.4018665; 07:59:12.2574085; 07:59:10.5612280]
val it : unit = ()
 
○Observable.split
 
// Signature:
Observable.split : ('T -> Choice<'U1,'U2>) -> IObservable<'T> -> IObservable<'U1> * IObservable<'U2>
 
// Usage:
Observable.split splitter source
 
二択型の関数を与えて、二つの窓口のタプルを返します。
 

let (splittEvent1, splittEvent2)= 
    originalEvent 
     |> Observable.split(fun (whatTimeArgs : WhatTimeDidItHappenEventArgs) ->
                            if whatTimeArgs.DateTime.Second <30 then
                                Choice1Of2(whatTimeArgs.DateTime.ToString()) //string型
                            else
                                Choice2Of2(whatTimeArgs.DateTime.Second))    //int型
                          
 
splittEvent1 .Add(fun args -> printfn "triggered times = %s" args) 
splittEvent2 .Add(fun args -> printfn "triggered times = %d" args)    
 
> t.SomethingHappen();;
triggered times = 2010/04/11 18:48:29
val it : unit = ()
> t.SomethingHappen();;
triggered times = 31
val it : unit = ()
 
○Observable.subscribe
Eventがtriggerされる毎に、それに反応して関数を実行するオブジェクトを返します。
 
// Signature:
Observable.subscribe : ('T -> unit) -> IObservable<'T> -> IDisposable
 
// Usage:
Observable.subscribe callback source
 

> let MySubsriber = Observable.subscribe (fun (whatTimeArgs : WhatTimeDidItHappenEventArgs) 
                                            -> printfn "triggered %A" whatTimeArgs.DateTime) 
                                       originalEvent    ;;
 
val MySubsriber : System.IDisposable
 
> t.SomethingHappen();;
triggered 2010/04/11 18:57:26
val it : unit = ()
 
Disposeすると、登録しておいた関数も取り除かれます。
 
> MySubsriber.Dispose();;
val it : unit = ()
> t.SomethingHappen();;
val it : unit = ()
スポンサーサイト

コメントの投稿

非公開コメント

プロフィール

T GYOUTEN

Author:T GYOUTEN
F#と英単語とフリーソフトと読書に興味があります。
ホームページでフリーソフトも公開しています。どぞ御贔屓に。

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
フリーエリア
フリーエリア
blogram投票ボタン
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。