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を取る関数でなければならない。