Swift

Swift で Enumerable モジュールを作ってみた

More than 3 years have passed since last update.


試しに Enumerable モジュールを作ってみた

無限リストを扱え、メソッドチェーンでリストを加工出来る Enumerable モジュールをSwiftで書いてみました。

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

ジェネレータの中でジェネレータを生成して、その中でさらにジェネレータを… と重ねていくのですが、

型チェックで無限ループに陥ってしまっているのかも知れません。