Swiftでストリームを扱うライブラリを書いた

FRPの記事をいくつか見てあまり理解できなかったので、Swiftでストリームを扱うライブラリを書いてみた。結論から言うと、まだストリームについて深く理解できていない感じがするので「FRPとは何か」「ストリームとは何か」といった話はしない。そういう話は他のエントリーを読んでほしいと思う。

naoty/Stream · GitHub

demo

let stream = Stream<String>()
let counterStream: Stream<Int> = stream.map({ message in
    return countElements(message)
}).scan(0, { previousMessage, message in
    return previousMessage + message
}).subscribe({ message in
    println(message)
})
stream.publish("Hello, ") //=> 7
stream.publish("wor")     //=> 10
stream.publish("ld!")     //=> 13

機能

  • ストリームにsubscribeで関数を渡すと、publishされたときにその関数がpublishの引数が渡されて実行される。subscribeは失敗時と完了時に実行する関数を指定することもできる。ストリームに失敗を通知するのはpublishの代わりにfail、完了を通知するのはcomplete
  • その他FRPのライブラリで実装されている次のような基本的なストリーム操作を実装した: map, filter, scan, flatMap, throttle, debounce, buffer, merge

結果

  • ストリームという概念については理解できたけど、FRPという世界観の一部を理解しただけのような気がする。
  • ライブラリ書いてみたけどSwiftクロージャの循環参照らへんの実装があやしい。おかしなところがあれば指摘してもらえると助かります。
  • iOS開発においてFRPをどのように適用できるか、まだ具体的なシーンがあまり思い浮かばない。けど、ストリームというのは概念をモデル化する際の見方の一つだと思うので、そういう見方があるということを理解した上で少しずつ既存のものの見方を変えてみるとわかってくるのかもしれないと思う。