1 | module Web.Async.Animate
3 | import Data.Linear.Token
6 | import Web.Async.Util
14 | data IntervalID : Type where [external]
16 | %foreign "browser:lambda:(n,h,w)=>setInterval(() => h(w),n)"
17 | prim__setInterval : Bits32 -> PrimIO () -> PrimIO IntervalID
19 | %foreign "browser:lambda:(i,w)=>clearInterval(i)"
20 | prim__clearInterval : IntervalID -> PrimIO ()
26 | every : (s : Sink e) => e -> (n : Bits32) -> IO1 (IO1 ())
28 | let i # t := ffi (prim__setInterval millis (primRun $
s.sink1 ev)) t
29 | in ffi (prim__clearInterval i) # t
36 | browser:lambda:(cont,h,w)=>{
37 | let previousTimeStamp;
39 | function step(timestamp) {
40 | if (previousTimeStamp === undefined)
41 | previousTimeStamp = timestamp;
42 | const dtime = timestamp - previousTimeStamp;
43 | previousTimeStamp = timestamp;
46 | window.requestAnimationFrame(step);
50 | window.requestAnimationFrame(step);
53 | prim__animate : PrimIO Boolean -> (Bits32 -> PrimIO ()) -> PrimIO ()
66 | animate : (s : Sink e) => (DTime -> e) -> IO1 (IO1 ())
69 | ffi (prim__animate (primRun $
read1 ref) (primRun . s.sink1 . ev))
70 | pure $
write1 ref false