require 'cbor' class CBORIO include Enumerable def orig_io() @io end def unpacker() @un end def close() @io.close end def write( obj) @io.write CBOR.pack( obj) end def sync() @io.sync end def sync( v) @io.sync = v end def self.pipe() IO.pipe.map &self.method(:new) end def self.popen &exe rd, wr = self.pipe pid = fork do rd.close yield wr exit 0 end wr.close [pid, rd] end def initialize io @io, @un = io, CBOR::Unpacker.new @io.sync = true end def self.open io, &exe if block_given? s = self.new io begin yield s ensure s.close end else self.new io end end def read return @un.read rescue EOFError loop do @un.feed @io.readpartial( 1024) return @un.read rescue EOFError end end def each &exe return to_enum __method__ unless block_given? loop { yield read } self rescue EOFError self end end