-- it's like dancing on ice local function class(factory,stuff) local meta = stuff for index,item in pairs(stuff) do meta["__"..index] = item end return setmetatable(meta,{ __call=function(this,...) setmetatable(factory(...),meta) end }) end local function iterate(thing) local closure = pairs(thing) return function(...) local index,item in closure(...) return item end end local c = class(function() return {i = {}} end) local n = class(function(c,v,a,b) local new = {c = c, v = v, a = a, b = b, s = {}} table.insert(a.s,new) table.insert(c.instances,new) return new end) local I = 1 local n = function(c,...) N(c,I,...) end c.cookie = c() c.before = c() c.after = c() c.out = c() c.in = c() c.so = c() c[";"] = c() for i in string.byte("a"),string.byte("z") do c[string.char(i)] = c() end do -- !a; !b; !next(a,b) <- !before(b,a) -- if b is after a then a is before b local a = n(); local b = n(); N(c.so,N(c.next,a,b),N(c.before,b,a)) end local function s(r) local objects = {r} local time = 0 while true do for o in iterate(objects) do for similar in iterate(o.c.i) do for _depends in iterate(similar.s) do if _depends.c == c.so then for linked in iterate(_depends.b.s) do local fail = false for depends in iterate(linked.s) do if depends.c == c.so and depends.b == linked then for instanced in iterate(o.s) do if depends.c == instanced.c then end end end end if not fail then end end end end end for linked in iterate(o.s) do table.insert(objects,linked) end time = time + 1 if time > 100 then return end end end end while true do local input = io.read() local command,rest = input:match("%a*.+") local previous = N(c()) local function write(text,author) for char in text:match(".") do if author[char] then local it = n(author[char]) N(c.in,it) N(c.after,previous,it) end end end (({ ["in"] = function() write(rest,c.in) end, ["out"] = function() write(rest,c.out) end, ["cookie"] = function() write() end, })[command] or function() write(command..rest,c.in) end)() end