UNPKG

@hypernym/frame

Version:
1 lines 1.35 kB
function e(e={}){let{scheduler:t=typeof window<`u`?requestAnimationFrame:()=>{},loop:n=!0,fps:r=!1}=e,i=new Map,a=[],o=new WeakSet,s=0,c=!1,l=!1,u=1e3/(r||60),d=0,f=0,p=0,m=()=>({delta:0,timestamp:0,isRunning:!1}),h=m(),g=()=>{let e=new Set,t=new Set,n=!1,r=!1,i=e=>{o.has(e)&&a.schedule(e),e(h)},a={schedule(r,{loop:i,schedule:a=!0}={}){let c=n&&!a?e:t;return i&&!o.has(r)&&(o.add(r),s++),c.add(r),r},add(o){if(n){r=!0;return}n=!0,[e,t]=[t,e],e.forEach(i),e.clear(),n=!1,r&&(r=!1,a.add(o))},delete(e){t.delete(e),o.has(e)&&s--,o.delete(e)}};return a},_=()=>{if(l)return;let e=performance.now()-p;if(c=s>0,r){let n=e-d;if(n<u){l||t(_);return}d=e-n%u,h.delta=u}else h.delta=h.timestamp===0?u:Math.min(Math.max(e-h.timestamp,1),40),d=e;h.timestamp=e,h.isRunning=!0,a.forEach(e=>i.get(e)?.add(h)),h.isRunning=!1,c&&n&&!l&&t(_)};return{add(e,{loop:n,phase:r=0,schedule:o=!0}={}){let s=i.get(r);return s||(a.push(r),a.sort((e,t)=>e-t),s=g(),i.set(r,s)),c||(c=!0,d=performance.now(),t(_)),s.schedule(e,{loop:n,phase:r,schedule:o})},delete(e){if(!e){h=m(),i.clear(),a=[],o=new WeakSet,s=d=f=p=0,c=l=!1;return}i.forEach(t=>t.delete(e))},start(){if(l&&c){l=!1;let e=performance.now();f&&=(p+=e-f,0),h.timestamp=d=e-p,t(_)}},stop(){l||(l=!0,f=performance.now())},get state(){return h},get fps(){return r},set fps(e){u=1e3/(e||60),r=e}}}export{e as createFrame};