Jump To …

Promise.lua

module(..., package.seeall)
local utils = require(_PACKAGE .. 'utils')
local List = require(_PACKAGE .. 'List')

local Promise = utils.public_class('Promise')

function Promise:initialize()
    self.finished = false
    self.functions = List()
    self.arguments = nil
end

function Promise.static.finished(...)
    local p = Promise()
    p:finish(...)
    return p
end

function Promise:add(fn)
    self.functions:push(fn)
    if self.finished then fn(unpack(self.arguments)) end
    return self
end

function Promise:finish(...)
    self.arguments = {...}
    self.finished = true
    for _, fn in self.functions:each() do
        fn(unpack(self.arguments))
    end
    return self
end

function Promise.static.test()
    local test1, test2

    local p = Promise()
    p:add(function(a, b) test1 = a+b end)
    p:finish(2, 5)
    assert(test1 == 7)

    p:add(function(a, b) test2 = a*b end)
    assert(test2 == 10)

    p = Promise.finished(2, 3, 4)
    p:add(function(...) test1 = #{...} end)
    assert(test1 == 3)
end

return Promise