UNPKG

@hypernym/frame

Version:
2 lines (1 loc) 1.45 kB
var Frame=function(M){"use strict";function k(v={}){let{scheduler:h=typeof window<"u"?requestAnimationFrame:()=>{},loop:y=!0,fps:w=!1}=v;const c=new Map;let g=[],l=new WeakSet,F=0,u=!1,n=!1;const W=40;let d=1e3/(w||60),o=0,i=0,S=0;const R=()=>({delta:0,timestamp:0,isRunning:!1});let s=R();const q=()=>{let e=new Set,r=new Set,a=!1,m=!1;const f=t=>{l.has(t)&&p.schedule(t),t(s)},p={schedule(t,{loop:x,schedule:A=!0}={}){const O=a&&!A?e:r;return x&&!l.has(t)&&(l.add(t),F++),O.add(t),t},add(t){if(a){m=!0;return}a=!0,[e,r]=[r,e],e.forEach(f),e.clear(),a=!1,m&&(m=!1,p.add(t))},delete(t){r.delete(t),l.has(t)&&F--,l.delete(t)}};return p},E=()=>{if(n)return;const e=performance.now()-S;if(u=F>0,w){const r=e-o;if(r<d){n||h(E);return}o=e-r%d,s.delta=d}else s.delta=s.timestamp===0?d:Math.min(Math.max(e-s.timestamp,1),W),o=e;s.timestamp=e,s.isRunning=!0,g.forEach(r=>c.get(r)?.add(s)),s.isRunning=!1,u&&y&&!n&&h(E)};return{add(e,{loop:r,phase:a=0,schedule:m=!0}={}){let f=c.get(a);return f||(g.push(a),g.sort((p,t)=>p-t),f=q(),c.set(a,f)),u||(u=!0,o=performance.now(),h(E)),f.schedule(e,{loop:r,phase:a,schedule:m})},delete(e){if(!e){s=R(),c.clear(),g=[],l=new WeakSet,F=o=i=S=0,u=n=!1;return}c.forEach(r=>r.delete(e))},start(){if(n&&u){n=!1;const e=performance.now();i&&(S+=e-i,i=0),s.timestamp=o=e-S,h(E)}},stop(){n||(n=!0,i=performance.now())},get state(){return s},get fps(){return w},set fps(e){d=1e3/(e||60),w=e}}}return M.createFrame=k,M}({});