{"body":"function callback.spin()\n\tlocal state\t\t\t= nil\n\tlocal callbacks\t= {}\n\n\tfunction callback.register_async(name, fn)\n\t\tif callbacks[name] ~= nil then\n\t\t\treturn ':error', 'callback already exists'\n\t\tend\n\n\t\tcallbacks[name] = { fn = fn }\n\t\treturn ':ok'\n\tend\n\n\tfunction callback.register_sync(name, fn)\n\t\tlocal ok, errmsg = callback.register_async(name, fn)\n\t\tif ok == ':error' then return ok, errmsg end\n\t\tcallbacks[name][sync] = true\n\t\treturn ':ok'\n\tend\n\n\twhile true do\n\t\tlocal msg = scheduler.recv()\n\t\tif type(msg) == 'table' then\n\t\t\tlocal hint     = msg[1]\n\t\t\tlocal callback = msg[2]\n\t\t\tlocal args     = msg[3] or {}\n\t\t\tlocal source   = msg[4]\n\t\t\tlocal tag      = msg[5]\n\n\t\t\tif hint == ':callback' then\n\t\t\t\t-- This is probably a callback. Proceed:\n\t\t\t\tif callbacks[callback] ~= nil then\n\t\t\t\t\tlocal retvals = table.pack( callbacks[callback]['fn'](state, table.unpack(args)) )\n\n\t\t\t\t\t-- Syncronous callbacks need return values:\n\t\t\t\t\tif source ~= nil and callbacks[callback['sync']] ~= nil then\n\t\t\t\t\t\tscheduler.send( source, {':callback-return', self(), callback, tag, retvals} )\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\tend\n\nend","name":"","extension":"txt","url":"https://www.irccloud.com/pastebin/21mr1uUB","modified":1527210179,"id":"21mr1uUB","size":1111,"lines":44,"own_paste":false,"theme":"","date":1527210179}