/** Signal is a demo element. \color #ac3 \symbol Sg \symmetries all */ element Signal{ DebugUtils du; EventWindow ew; AtomUtils au; Random rm; Unsigned(6) density; Void diffuse(){ if(ew[1] is Empty){ ew.swap(0,1); } } Bool chkDense(){ WindowServices ws; ws.reset(0,4); Signal s; Int st=au.getType((Atom) s); if(ws.scan(st)){ density=ws.getHits(0); if(density<=1){ return false; } } return true; } Void catchRequest(){ WindowServices ws; Random rdm; ws.reset(1,4); Request r; Int rt=au.getType((Atom) r); for(Int slot=ws.next();slot>=0;slot=ws.next()){ Atom a= ew[slot]; if(a is Request){ Request you=(Request) a; if(density>you.density){ if(rdm.oneIn(2)){ ew.swap(0,slot); } } } } } Void behave(){ Bool isAlive=true; if(chkDense()){// if alone, I can walk around. I store the number of Signals that I observed. diffuse(); } else{ // if I am alone, I have some chance to disappear. if(rm.oneIn(density*5-4)){ Empty e; ew[0]=e; isAlive=false; } } if(isAlive){ catchRequest(); // if not disappear, I will swap position with some Request who observe // less Signal than me. } } }