6.61. kink/io/GENERATOR_INPUT¶
6.61.1. GENERATOR_INPUT.new($generator)¶
newは、そのバイト列が、$generatorの呼び出しの中でoutputに書き込まれることで渡されるようなinputを戻す。
例
:BIN.require_from('kink/')
:CONTROL.require_from('kink/')
:GENERATOR_INPUT.require_from('kink/io/')
CONTROL.with_finally{(:finally)
:In = GENERATOR_INPUT.new{(:Out)
Out.write(BIN.of(1 2 3))
Out.write(BIN.of(4 5 6 7))
Out.write(BIN.of(8 9 10 11 12))
}
finally{ In.close }
:loop <- {
In.read(4){(:C)
C.on_success{(:Bin)
stdout.print_line(Bin.repr)
loop
}
C.on_eof{ stdout.print_line('EOF') }
}
}
loop
}
# Output:
# (bin 0x01 0x02 0x03)
# (bin 0x04 0x05 0x06 0x07)
# (bin 0x08 0x09 0x0a 0x0b)
# (bin 0x0c)
# EOF
バイト列を渡す
In.readが初めて呼ばれると、outputを引数として$generatorが呼ばれる。
$generatorの呼び出しの中でOut.writeが呼ばれると、$generatorの呼び出しは中断されて、バイト列がinputに渡される。
inputがもっとバイト列を要求すると、$generatorの呼び出しが再開される。
$generatorの呼び出しが戻すと、inputはEOFに達する。
inputを閉じる
newが作ったinputは、CONTROL.with_finallyを使って閉じることが推奨される。これは、$generatorの中の終了処理が適切に行われるようにするためである。
inputがIn.readよりも前に閉じられた場合、またはEOFに到達したあとに閉じられた場合、inputは単に閉じた状態にされる。
中断された$generatorの呼び出しがある状態でinputが閉じられた場合、その呼び出しは再開される。現在および後続するOut.writeの呼び出しはIOエラーになる。
$generatorが投げた例外
$generatorが例外を投げた場合、現在および後続するIn.readの呼び出し、または現在のIn.closeの呼び出しはIOエラーになる。
outputは閉じない
$generatorに渡されるoutputは閉じるべきでない。Out.closeは常にIOエラーになる。
事前条件
$generatorは、outputを取る関数でなければならない。