# File lib/ole/ranges_io.rb, line 54
  def initialize io, mode='r', params={}
    mode, params = 'r', mode if Hash === mode
    ranges = params[:ranges]
    @params = {:close_parent => false}.merge params
    @mode = IO::Mode.new mode
    @io = io
    # convert ranges to arrays. check for negative ranges?
    ranges ||= [0, io.size]
    @ranges = ranges.map { |r| Range === r ? [r.begin, r.end - r.begin] : r }
    # calculate size
    @size = @ranges.inject(0) { |total, (pos, len)| total + len }
    # initial position in the file
    @pos = 0

    # handle some mode flags
    truncate 0 if @mode.truncate?
    seek size if @mode.append?
  end