1 | module Web.MVC.Animate
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
22 | timed : (Integer -> e) -> Cmd e -> Cmd e
23 | timed toEv (C f) = C $
\h => do
35 | data IntervalID : Type where [external]
37 | %foreign "browser:lambda:(n,h,w)=>setInterval(() => h(w),n)"
38 | prim__setInterval : Bits32 -> IO () -> PrimIO IntervalID
40 | %foreign "browser:lambda:(i,w)=>clearInterval(i)"
41 | prim__clearInterval : IntervalID -> PrimIO ()
47 | every : e -> (n : Bits32) -> Cmd e
49 | C $
\h => ignore $
primIO (prim__setInterval millis (runJS $
h ev))
56 | everyWithCleanup : (IO () -> e) -> e -> Bits32 -> Cmd e
57 | everyWithCleanup cleanUpToEv ev millis =
58 | C $
\h => Prelude.do
59 | id <- primIO (prim__setInterval millis (runJS $
h ev))
60 | h (cleanUpToEv $
primIO (prim__clearInterval id))
67 | browser:lambda:(stop,h,w)=>{
68 | let previousTimeStamp;
70 | function step(timestamp) {
71 | if (previousTimeStamp === undefined)
72 | previousTimeStamp = timestamp;
73 | const dtime = timestamp - previousTimeStamp;
74 | previousTimeStamp = timestamp;
75 | if (stop(w) === 0) {
77 | window.requestAnimationFrame(step);
81 | window.requestAnimationFrame(step);
84 | prim__animate : IO Bits32 -> (Bits32 -> IO ()) -> PrimIO ()
94 | animate : (DTime -> e) -> Cmd e
95 | animate toEv = C $
\h => Prelude.do
96 | primIO $
prim__animate (pure 0) (runJS . h . toEv)
104 | animateWithCleanup : (IO () -> e) -> (DTime -> e) -> Cmd e
105 | animateWithCleanup cleanupToEv toEv = C $
\h => Prelude.do
106 | ref <- newIORef (the Bits32 0)
107 | primIO $
prim__animate (readIORef ref) (runJS . h . toEv)
108 | h $
cleanupToEv (writeIORef ref 1)