Files
Nasal-Interpreter/test/maketimer_sim.nas
ValKmjolnir 190014a3e5 🐛 fix bug that gc cannot mark values in coroutine & add maketimer_sim.nas
update props_sim.nas

update auto_crash.nas
2022-05-23 20:23:20 +08:00

88 lines
1.9 KiB
Plaintext

var process=nil;
var task={};
var event={};
var add_event=func(name,interval,function){
event[name]=coroutine.create(func{
unix.sleep(interval);
println("[event] ",name);
function();
});
}
var add_task=func(name,interval,function){
task[name]=coroutine.create(func{
while(1){
unix.sleep(interval);
println("[task] ",name);
function();
coroutine.yield();
}
});
}
var remove_task=func(name){
if(contains(task,name))
delete(task,name);
}
var remove_event=func(name){
if(contains(event,name))
delete(event,name);
}
var maketimer=func(interval,function){
var name="nasal-timer-";
var res={
start:func{
if(me.isRunning)
return;
me.isRunning=1;
if(me.singleShot){
add_event(name,interval,function);
}else{
add_task(name,interval,function);
}
},
stop:func{
if(me.isRunning){
remove_task(name);
me.isRunning=0;
}
},
restart:func(itv){
interval=itv;
me.stop();
me.start();
},
singleShot:0,
isRunning:0,
simulatedTime:0
};
name~=id(res);
return res;
}
var simulation=func(){
var running=1;
while(running){
running=0;
foreach(var i;keys(task)){
if(coroutine.resume(task[i])!=nil){
running=1;
}else{
remove_task(i);
}
}
foreach(var i;keys(event)){
if(coroutine.resume(event[i])!=nil){
running=1;
}else{
remove_event(i);
}
}
}
}