Warning: this is an htmlized version!
The original is here, and
the conversion rules are here.
-- This file:
--   http://anggtwu.net/LUA/CoroRepl2.lua.html
--   http://anggtwu.net/LUA/CoroRepl2.lua
--          (find-angg "LUA/CoroRepl2.lua")
-- Author: Eduardo Ochs <eduardoochs@gmail.com>
--
-- (defun e () (interactive) (find-angg "LUA/CoroRepl2.lua"))
-- (defun o () (interactive) (find-angg "LUA/CoroRepl1.lua"))

-- «.ReplIOB»		(to "ReplIOB")
-- «.ReplIOB-tests»	(to "ReplIOB-tests")
-- «.ReplOut»		(to "ReplOut")
-- «.ReplOut-tests»	(to "ReplOut-tests")
-- «.ReplIOC»		(to "ReplIOC")
-- «.ReplIOC-tests»	(to "ReplIOC-tests")
-- «.ReplTest»		(to "ReplTest")
-- «.ReplTest-tests»	(to "ReplTest-tests")

sprint = function (...)
    local args = pack(...)
    return mapconcat(tostring, args, "\t", args.n).."\n"
  end


--  ____            _ ___ ___  ____  
-- |  _ \ ___ _ __ | |_ _/ _ \| __ ) 
-- | |_) / _ \ '_ \| || | | | |  _ \ 
-- |  _ <  __/ |_) | || | |_| | |_) |
-- |_| \_\___| .__/|_|___\___/|____/ 
--           |_|                     
--
-- "Repl I/O, basic version"
-- «ReplIOB»  (to ".ReplIOB")

ReplIOB = Class {
  type    = "ReplIOB",
  __index = {
    pwrite = function (riob,p)   io.write(p) end,
    owrite = function (riob,o)   io.write(o) end,
    oprint = function (riob,...) print(...) end,
    iread  = function (riob)     return io.read() end,
    stop   = function (riob)     end,
  },
}

-- «ReplIOB-tests»  (to ".ReplIOB-tests")



--  ____            _  ___        _   
-- |  _ \ ___ _ __ | |/ _ \ _   _| |_ 
-- | |_) / _ \ '_ \| | | | | | | | __|
-- |  _ <  __/ |_) | | |_| | |_| | |_ 
-- |_| \_\___| .__/|_|\___/ \__,_|\__|
--           |_|                      
--
-- «ReplOut»  (to ".ReplOut")

ReplOut = Class {
  type  = "ReplOut",
  from  = function (i,o,p,s) return ReplOut {i=i, o=o, p=p, s=s} end,
  __tostring = function (ro)
      local f = function (x) return (mytostring(x):gsub("\\\n", "|")) end
      return format("[i=%s, o=%s, p=%s, s=%s]",
                    f(ro.i), f(ro.o), f(ro.p), f(ro.s))
    end,
  __index = {
    concat = function (ro) return (ro.i or "")..(ro.o or "")..(ro.p or "") end,
  },
}

-- «ReplOut-tests»  (to ".ReplOut-tests")



--  ____            _ ___ ___   ____ 
-- |  _ \ ___ _ __ | |_ _/ _ \ / ___|
-- | |_) / _ \ '_ \| || | | | | |    
-- |  _ <  __/ |_) | || | |_| | |___ 
-- |_| \_\___| .__/|_|___\___/ \____|
--           |_|                     
--
-- "Repl I/O, coroutine version"
-- «ReplIOC»  (to ".ReplIOC")

ReplIOC = Class {
  type    = "ReplIOC",
  __index = {
    data = function (rioc,stop)
        return ReplOut.from(rioc.i, rioc.o, rioc.p, stop)
      end,
    setdata = function (rioc,i,s) rioc.i,rioc.o,rioc.p,rioc.s = i,nil,nil,s end,
    pwrite  = function (rioc,p)   rioc.p = p end,
    owrite  = function (rioc,o)   rioc.o = (rioc.o or "")..o end,
    oprint  = function (rioc,...) rioc:owrite(sprint(...)) end,
    stop    = function (rioc)     return rioc:data(nil,"stop") end,
    iread   = function (rioc)
        local i = coy(rioc:data())
        rioc:setdata(i)
        return rioc.i
      end,
  },
}

-- «ReplIOC-tests»  (to ".ReplIOC-tests")
--[==[
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
dofile "CoroRepl2.lua"
r = ReplIOC {}
= r:data()
= r:setdata("iiii")
= r:data()
= r:data("STOP")
= r:oprint(20, nil)
= r:data()
= r:oprint(30, 40)
= r:data()

--]==]


--  ____            _ _____         _   
-- |  _ \ ___ _ __ | |_   _|__  ___| |_ 
-- | |_) / _ \ '_ \| | | |/ _ \/ __| __|
-- |  _ <  __/ |_) | | | |  __/\__ \ |_ 
-- |_| \_\___| .__/|_| |_|\___||___/\__|
--           |_|                        
-- «ReplTest»  (to ".ReplTest")

ReplTest = Class {
  type    = "ReplTest",
  __index = {
    read1  = function (r) r.rio:pwrite("c> ");  return r.rio:iread() end,
    read2  = function (r) r.rio:pwrite("c>> "); return r.rio:iread() end,
    simple = function (r)
        while true do
          local a = r:read1()
          local b = r:read2()
          r.rio:oprint("Received: "..bitrim(a)..","..bitrim(b))
          if b:match"stop" then return r.rio:stop() end
        end
      end,
  },
}

-- «ReplTest-tests»  (to ".ReplTest-tests")
--[==[
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
dofile "CoroRepl2.lua"
rt = ReplTest { rio = ReplIOB {} }
= rt:simple()
 foo
  bar
 plic
  ploc
 qux
  stop

rt = ReplTest { rio = ReplIOC {} }
f = cow(function () return rt:simple() end)
= f()
= f("foo")
= f(" bar")
= f("plic")
= f(" ploc")
= f("qux")
= f(" stop")
= f("")

f = cow(function () rt:simple() end)
g = function (...) PP(f(...)) end
g()
g("foo")
g(" bar")
g("plic")
g(" ploc")
g("qux")
g(" stop")
g("")

h = cow(function ()
    coy(20)
    coy(30)
    return 40
  end)
= h()   --> 20
= h()   --> 30
= h()   --> 40
= h()   --> error: cannot resume dead coroutine

--]==]








-- Local Variables:
-- coding:  utf-8-unix
-- End: