Home

Awesome

luvit-stream

Stream interface in Luvit

Examples

A simple example of Readable stream in string mode:


local stream = require('..')

local Numbers = stream.Readable:extend()

function Numbers:initialize(count, options)
  local opt = options or {}
  stream.Readable.initialize(self, opt)
  self.current = 1
  self.count = count
end

function Numbers:_read()
  if self.current > self.count then
    self:push(nil)
    return
  else
    self:push(tostring(self.current))
    self.current = self.current + 1
  end
end

Numbers:new(9):pipe(process.stdout)

A more complex example using object mode with a Readable stream and two Transform streams:


local stream = require('..')
local fs = require('fs')
local core = require('core')

local Numbers = stream.Readable:extend()

function Numbers:initialize(count, options)
  local opt = options or {}
  opt.objectMode = true
  stream.Readable.initialize(self, opt)
  self.current = 1
  self.count = count
end

function Numbers:_read()
  if self.current > self.count then
    self:push(nil)
    return
  else
    self:push({num = self.current})
    self.current = self.current + 1
  end
end


local NumberIncreaser = stream.Transform:extend()

function NumberIncreaser:initialize(options)
  local opt = options or {}
  opt.objectMode = true
  stream.Transform.initialize(self, opt)
end

function NumberIncreaser:_transform(data, encoding, callback)
  callback(nil, {num = data.num + 1})
end


local Stringify = stream.Transform:extend()

function Stringify:initialize(options)
  local opt = options or {}
  opt.objectMode = true
  stream.Transform.initialize(self, opt)
end

function Stringify:_transform(data, encoding, callback)
  if data and data.num then
    callback(nil, tostring(data.num))
  end
end

Numbers:new(9):pipe(NumberIncreaser:new()):pipe(Stringify:new()):pipe(process.stdout)