/* * Created by SharpDevelop. * User: elijah * Date: 12/22/2011 * Time: 3:21 PM * * To change this template use Tools | Options | Coding | Edit Standard Headers. */ using System; using System.Collections.Generic; using SharpLua.LuaTypes; namespace SharpLua.Library { /// /// coroutine library /// public class CoroutineLib { public static void RegisterModule(LuaTable env) { LuaTable module = new LuaTable(); RegisterFunctions(module); env.SetNameValue("coroutine", module); } public static void RegisterFunctions(LuaTable module) { module.Register("create", Create); module.Register("resume", Resume); module.Register("running", Running); module.Register("status", Status); module.Register("wrap", Wrap); module.Register("yield", Yield); } public static LuaValue Create(LuaValue[] args) { LuaFunction func = args[0] as LuaFunction; if (func == null) throw new ArgumentException("Function expected, got '" + args[0].Value.GetType().Name + "'"); LuaCoroutine c = new LuaCoroutine(func); return c; } public static LuaValue Resume(LuaValue[] args) { LuaCoroutine c = args[0] as LuaCoroutine; List args2 = new List(); foreach (LuaValue v in args) args2.Add(v); args2.RemoveAt(0); // remove coroutine c.Resume(args2.ToArray()); return LuaNil.Nil; } public static LuaValue Running(LuaValue[] args) { if (LuaCoroutine.Running == null) return LuaNil.Nil; return LuaCoroutine.Running; } public static LuaValue Status(LuaValue[] args) { LuaCoroutine c = args[0] as LuaCoroutine; return new LuaString(c.Status); } public static LuaValue Wrap(LuaValue[] args) { LuaFunction f = args[0] as LuaFunction; LuaCoroutine c = new LuaCoroutine(f); LuaFunction f2 = new LuaFunction(new LuaFunc(delegate(LuaValue[] args2) { return LuaBoolean.From(c.Resume(args2)); })); return f2; } public static LuaValue Yield(LuaValue[] args) { LuaCoroutine c = LuaCoroutine.Running; c.Pause(); // TODO: set restart args return LuaNil.Nil; } } }