Skip to content

Instantly share code, notes, and snippets.

@daurnimator
Created October 12, 2011 03:26
Show Gist options
  • Select an option

  • Save daurnimator/1280183 to your computer and use it in GitHub Desktop.

Select an option

Save daurnimator/1280183 to your computer and use it in GitHub Desktop.
Now with generalised lazy buffer.
local general = require"general"
local len = general.len
local decode = require"decode"
local new_fifo = require"fifo"
local lazybuffer = require"lazybuffer"
local empty_item = { source = "silent" , from = 0 , to = math.huge }
local function setup ( outputbuffers )
local queue = new_fifo ( )
queue:setempty ( function ( f ) return empty_item end )
local current_offset
local get = function ( )
local item = queue:pop()
current_offset = item.from
local left = item.to - current_offset
return item , left
end
local put = function ( r , item , len )
decode ( r , item.source , current_offset , len )
current_offset = current_offset + len
return r + len
end
fill = lazybuffer ( get, put )
local current_outputbuffer = 1
local step = function ( )
local buff = outputbuffers [ current_outputbuffer ]
fill ( buff , len(buff) )
current_outputbuffer = ( current_outputbuffer % len(outputbuffers) ) + 1
end
return {
queue = queue ;
step = step ;
}
end
return setup
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment