6.70. kink/iter/IFUN

ifunの操作。

“ifun”は“iterator function”、つまりイテレータ関数の略語である。ifunは有限長、または無限長の値のストリームにおけるポインタとして動作する関数である。

通常、ifunを直接使うよりも、ifunのラッパであるiterを使ったほうが便利だ。iterについてはkink/iter/ITERを見よ。

仕様

ifunは2引数の関数で、$procと$finを引数に取る。要素が存在する場合、ifunは$procを末尾呼び出ししなければならない。要素がなければ、ifunは$finを引数なしで末尾呼び出ししなければならない。

$procは2引数の関数で、Headと$tailを引数に取る。ifunは最初の要素をHeadとして、Headより後ろの要素を含む後続のifunを$tailとして渡す。

$finはサンクであり、ifunに要素がないときに末尾呼び出しされる。

例

次のプログラムでは、make_vec_ifunが、Vecの要素をたどるifunを作る。

ifunを作ってみよう。

IFUN.eachを使って、$nums_ifunの要素をたどることができる。

ifunの要素をマッピングする別のifunも作れる。

要素を足し合わせてみよう。

6.70.1. IFUN.each($ifun $consume)

eachは$ifunのそれぞれの要素について$consumeを呼び出す。

事前条件

$ifunはifunでなければならない。

$consumeは引数をひとつ取る関数でなければならない。

例

6.70.2. IFUN.map($ifun $transform)

mapはN番目の要素がtransform($ifunのN番目の要素)であるようなifunを戻す。

事前条件

$ifunはifunでなければならない。

$transformは引数をひとつ取らなければならない。

例

6.70.3. IFUN.concat_map($ifun $to_ifun)

concat_mapは、to_ifun($ifunの要素)の結果であるifunを結合したifunを戻す。

事前条件

$ifunはifunでなければならない。

$to_ifunは引数をひとつ取り、ifunを戻さなければならない。

例

6.70.4. IFUN.filter($ifun $include?)

filterは$ifunの要素のうち$include?を満たすものを、ifunとして戻す。要素の順序は変わらない。

事前条件

$ifunはifunでなければならない。

$include?は述語でなければならない。

例

6.70.5. IFUN.count($ifun $counted?)

countは$ifunの要素のうち$counted?を満たす要素の数を戻す。

結果は整数のnum値である。

事前条件

$ifunはifunでなければならない。

$counted?は述語でなければならない。

例

6.70.6. IFUN.fold($ifun Init $combine)

foldはInitを種として、$ifunの要素を畳み込んだ値を戻す。

$ifunの要素がE1, E2, ,,, En_1, Enであるとき、foldはcombine(combine(,,,combine(combine(Init E1) E2),,, En_1) En)を戻す。

$ifunが空の場合、foldはInitを戻す。

事前条件

$ifunはifunでなければならない。

$combineはふたつの引数を取らなければならない。

例

6.70.7. IFUN.reduce($ifun $combine ...[$empty_fallback])

reduceは$ifunの要素を相互に畳み込む。

$ifunの要素がE1, E2, E3, ,,, En_1, Enであるとき、reduceはcombine(combine(,,,combine(combine(E1 E2) E3),,, En_1) En)を戻す。

$ifunの要素がEひとつであるとき、reduceはEを戻す。

$ifunが要素を持たず、$empty_fallbackが与えられているとき、reduceは$empty_fallbackを引数なしで末尾呼び出しする。

$ifunが要素を持たず、$empty_fallbackが与えられていないとき、reduceは例外を投げる。

事前条件

$ifunはifunでなければならない。

$combineはふたつの引数を取らなければならない。

$empty_fallbackはサンクでなければならない。

例

6.70.8. IFUN.take_front($ifun N)

take_frontは$ifunの最初のN個の要素を含むifunを戻す。$ifunの要素がN個より少ないときは、すべての要素を含むifunを戻す。

事前条件

$ifunはifunでなければならない。

Nは整数のnum値でなければならない。

例

6.70.9. IFUN.drop_front($ifun N)

drop_frontは$ifunの最初のN個の要素を除いたifunを戻す。$ifunの要素がN個より少ないときは、空のifunを戻す。

事前条件

$ifunはifunでなければならない。

Nは整数のnum値でなければならない。

例

6.70.10. IFUN.take_while($ifun $include?)

take_whileは、すべての要素が$include?を満たすような、$ifunの最長の先頭部分を、ifunとして戻す。

事前条件

$ifunはifunでなければならない。

$include?は述語でなければならない。

例

6.70.11. IFUN.drop_while($ifun $exclude?)

drop_whileは、すべての要素が$exclude?を満たすような、$ifunの最長の先頭部分を取り除き、残りをifunとして戻す。

事前条件

$ifunはifunでなければならない。

$exclude?は述語でなければならない。

例

6.70.12. IFUN.all?($ifun $match?)

all?は、$ifunのすべての要素が$match?を満たすときにtrueを戻し、そうでないときにfalseを戻す。

$ifunの要素数が無限の場合、all?は戻ることが保証されない。

事前条件

$ifunはifunでなければならない。

$match?は述語でなければならない。

例

6.70.13. IFUN.any?($ifun $match?)

any?は$ifunのひとつ以上の要素が$match?を満たすときにtrueを戻し、そうでないときにfalseを戻す。

$ifunの要素数が無限の場合、any?は戻ることが保証されない。

事前条件

$ifunはifunでなければならない。

$match?は述語でなければならない。

例

6.70.14. IFUN.concat($ifun_of_ifuns)

concatは$ifun_of_ifunsに含まれるifunの要素を連結する。

事前条件

$ifun_of_ifunsはifunを要素に持つifunでなければならない。

例

6.70.15. IFUN.unconcat($ifun Chunk_size)

unconcatは$ifunを、長さがChunk_sizeであるようなベクタに分割し、それらベクタを要素に持つifunを戻す。

$ifunの長さが有限の数Chunk_size * N + R, ただしNとRは非負の整数, であるとき、$ifunの最後のR個の要素は捨てられる。

事前条件

$ifunはifunでなければならない。

Chunk_sizeは正の整数のnum値でなければならない。

例

6.70.16. IFUN.cycle($ifun)

cycleは$ifunの要素を無限に繰り返したifunを戻す。

$ifunが空の場合、結果のifunも空になる。

事前条件

$ifunはifunでなければならない。

例

6.70.17. IFUN.of(...Elems)

ofはElemsの要素を持つifunを戻す。

例

6.70.18. IFUN.join($front $back)

joinはふたつのifun、$frontと$backをつなげたifunを戻す。

結果のifunは、$frontの要素を順番通りに、それについで$backの要素を順番通りに持つ。

例

6.70.19. IFUN.zip($ifun ...Other_ifuns)

zipにN個のifunが渡されたとき、zipは、長さが引数のifunの中で最短のものと同じ長さであり、それぞれの要素がN個の要素のvecで、そのvecが渡されたifunの対応する要素からなるようなifunを戻す。

たとえば、ifun XがX1, X2, X3, ,,,を要素に持ち、YがY1, Y2, Y3, ,,,,を要素に持ち、ZがZ1, Z2, Z3, ,,,,を要素に持つ場合、zip(X Y Z)は[X1 Y1 Z1], [X2 Y2 Z2], [X3 Y3 Z3], ,,,を持つifunを戻す。

事前条件

$ifunはifunでなければならない。

Other_ifunsのそれぞれの要素はifunでなければならない。

例

6.70.20. IFUN.lazy($make_ifun)

lazyは、$make_funが戻すifunと同じ要素を持つifunを戻す。

$make_funは、結果のifunが呼ばれたときに呼ばれる。

事前条件

$make_ifunはifunを戻すサンクでなければならない。

例

6.70.21. IFUN.from_generator($generator)

from_generatorは$generatorの中で算出された要素を含むifunを戻す。

$generatorは、引数ひとつの関数$yieldを引数に取らなければならない。$generatorの呼び出しの中で$yieldが引数とともに呼ばれると、その引数が結果のifunの要素になる。$generatorの呼び出しが終わると、そこがifunの末尾になる。

$generatorはifunが呼ばれた時に呼び出される。$generatorの呼び出しは、$yieldが呼ばれた時に中断される。呼び出しは、後続するifunが呼ばれた時に再開される。

例: 有限長のifunを作る

例: 無限長のifunを作る

6.70.22. IFUN.from_each(Eacher)

from_eachはEacher.eachで列挙される値を要素に持つifunを戻す。

eachの呼び出しは、ifunの要素の評価ごとに中断、再開される。

事前条件

Eacherはeach($consume)メソッドをサポートしなければならない。eachメソッドは、Eacherの要素を列挙するために呼ばれる。

例