Module Netstream

module Netstream: sig .. end
A netstream is an input channel that is read block by block. The fragment of the channel currently loaded into memory is called the current window of the netstream. The window can be thought as look-ahead buffer.


 0                pos_in        pos_in + window_length            EOF
                     The current window

You can use a netstream like an in_obj_channel, and read characters and strings from the stream. The bytes come first from the look-ahead buffer, and if there are not enough bytes, they are loaded from the underlying channel. After every read operation it is tried to enlarge the window such that it contains at least one block.

If you want that the window becomes larger, you can call want (to enlarge the window to a certain size) or want_another_block (to load just another block from the underlying channel). Note that this affects only the current window and not the future size of the window.

Note Buffer_underrun: netstreams can cope with underruns of underlying channels. An underrun happens when it is not possible to ensure the minimum window size. However, it is possible that the window size sinks under the minimum, but the Buffer_underrun is deferred until the next call of an input method. Furthermore, there is a problem in the skip method which may only be partially executed, i.e. the method skips some bytes and then raises Buffer_underrun.

class type in_obj_stream = object .. end
An in_obj_stream extends in_obj_channel by look-ahead methods
class input_stream : ?len:int -> ?block_size:int -> Netchannels.in_obj_channel -> in_obj_stream
Make an in_obj_stream on top of an in_obj_channel.
class sub_stream : ?len:int -> ?delimiter:string -> in_obj_stream -> in_obj_stream
A sub stream is the part of the whole stream from the current position to an arbitrary other position that is determined by len and delimiter.
val print_in_obj_stream : Format.formatter -> in_obj_stream -> unit
A top-loop printer for streams