11 | %foreign "javascript:lambda:(w) => BigInt(new Date().getTime())"
12 | prim__time : PrimIO Integer
16 | currentTime : HasIO io => io Integer
17 | currentTime = primIO prim__time
25 | data IntervalID : Type where [external]
27 | %foreign "browser:lambda:(n,h,w)=>setInterval(() => h(w),n)"
28 | prim__setInterval : Bits32 -> IO () -> PrimIO IntervalID
30 | %foreign "browser:lambda:(i,w)=>clearInterval(i)"
31 | prim__clearInterval : IntervalID -> PrimIO ()
39 | setInterval : HasIO io => Bits32 -> JSIO () -> io (IntervalID)
40 | setInterval millis run = primIO $
prim__setInterval millis (runJS run)
44 | clearInterval : HasIO io => IntervalID -> io ()
45 | clearInterval id = primIO $
prim__clearInterval id
52 | browser:lambda:(h,w)=>{
53 | let previousTimeStamp;
56 | function step(timestamp) {
57 | if (previousTimeStamp === undefined)
58 | previousTimeStamp = timestamp;
59 | const dtime = timestamp - previousTimeStamp;
60 | previousTimeStamp = timestamp;
63 | window.requestAnimationFrame(step);
67 | window.requestAnimationFrame(step);
70 | prim__animate : (Bits32 -> IO Bits32) -> PrimIO ()
86 | animate : HasIO io => (DTime -> JSIO ()) -> io (IO ())
88 | ref <- newIORef (the Bits32 0)
89 | primIO $
prim__animate (\dt => runJS (run dt) >> readIORef ref)
90 | pure (writeIORef ref 1)
94 | showFPS : Bits32 -> String
95 | showFPS n = #"FPS: \#{show n}"#
100 | fps : (n : Nat) -> MSF m DTime (Event Bits32)
101 | fps n = mealy acc (n,0)
104 | acc : DTime -> (Nat,DTime) -> HList [(Nat,DTime),Event Bits32]
105 | acc dt (0,tot) = [(n,0),Ev $
(1000 * cast (S n)) `div` (tot + dt)]
106 | acc dt (S k,tot) = [(k, tot + dt), NoEv]