local util = {}

util.pack = table.pack or function(...)
    return {
        n = select('#', ...),
        ...,
    }
end
util.unpack = table.unpack or _G.unpack
util.eq = function(x, y)
    return x == y
end
util.noop = function()
end
util.identity = function(x)
    return x
end
util.constant = function(x)
    return function()
        return x
    end
end
util.isa = function(object, class)
    return type(object) == 'table' and getmetatable(object).__index == class
end
util.tryWithObserver = function(observer, fn, ...)
    local success, result = pcall(fn, ...)
    if not success then
        observer:onError(result)
    end
    return success, result
end

return util
