試しに Enumerable モジュールを作ってみた
無限リストを扱え、メソッドチェーンでリストを加工出来る Enumerable モジュールをSwiftで書いてみました。
例えば、こんな使い方が出来ます。
import Enumerable
var x = Enumerable(sequence: 1...100)
println(x.filter{$0 % 2 != 0}.map{$0 * 3}.take(10).toArray())
//=> [3, 9, 15, 21, 27, 33, 39, 45, 51, 57]
その他のサンプルプログラムはこちら
→ enumerable_sample.swift
クロージャで実装
当初は Generator を使って作ってみていたのですが、next() の型宣言まわりでどうにも上手く行かないケースがあり、大変苦労したあげく断念しました。
苦労した理由はこれ → protocol はジェネリックに出来ない
クロージャで実装する事を思いついたのでやってみると、あっさり実装できて、しかもシンプルになりました。
Generatorでの実装はこれ → BadEnumerable.swift
一応そこそこには動きますが、複雑な事をするとコンパイラが死にます。
コンパイル出来ないものがこれ → badEnumerable_sieve.swift
ジェネレータの中でジェネレータを生成して、その中でさらにジェネレータを… と重ねていくのですが、
型チェックで無限ループに陥ってしまっているのかも知れません。