@@ -26,6 +26,12 @@ module DOM.HTML.Window
2626 , url
2727 , localStorage
2828 , sessionStorage
29+ , requestAnimationFrame
30+ , cancelAnimationFrame
31+ , RequestAnimationFrameId
32+ , requestIdleCallback
33+ , cancelIdleCallback
34+ , RequestIdleCallbackId
2935 ) where
3036
3137import Control.Monad.Eff (Eff )
@@ -34,7 +40,8 @@ import DOM.HTML.Types (ALERT, CONFIRM, HISTORY, HTMLDocument, History, Location,
3440import DOM.WebStorage.Types (Storage )
3541import Data.Maybe (Maybe )
3642import Data.Nullable (Nullable , toMaybe )
37- import Prelude (Unit , (<$>))
43+ import Data.Newtype (class Newtype , unwrap )
44+ import Prelude (class Eq , class Ord , Unit , (<$>), (<<<), map )
3845
3946foreign import document :: forall eff . Window -> Eff (dom :: DOM | eff ) HTMLDocument
4047
@@ -102,3 +109,37 @@ foreign import scrollY :: forall eff. Window -> Eff (dom :: DOM | eff) Int
102109foreign import localStorage :: forall eff . Window -> Eff (dom :: DOM | eff ) Storage
103110
104111foreign import sessionStorage :: forall eff . Window -> Eff (dom :: DOM | eff ) Storage
112+
113+ newtype RequestAnimationFrameId = RequestAnimationFrameId Int
114+
115+ derive instance newtypeRequestAnimationFrameId :: Newtype RequestAnimationFrameId _
116+ derive instance eqRequestAnimationFrameId :: Eq RequestAnimationFrameId
117+ derive instance ordRequestAnimationFrameId :: Ord RequestAnimationFrameId
118+
119+ foreign import _requestAnimationFrame :: forall eff . Eff (dom :: DOM | eff ) Unit -> Window -> Eff (dom :: DOM | eff ) Int
120+
121+ requestAnimationFrame :: forall eff . Eff (dom :: DOM | eff ) Unit -> Window -> Eff (dom :: DOM | eff ) RequestAnimationFrameId
122+ requestAnimationFrame fn = map RequestAnimationFrameId <<< _requestAnimationFrame fn
123+
124+ foreign import _cancelAnimationFrame :: forall eff . Int -> Window -> Eff (dom :: DOM | eff ) Unit
125+
126+ cancelAnimationFrame :: forall eff . RequestAnimationFrameId -> Window -> Eff (dom :: DOM | eff ) Unit
127+ cancelAnimationFrame idAF = _cancelAnimationFrame (unwrap idAF)
128+
129+ newtype RequestIdleCallbackId = RequestIdleCallbackId Int
130+
131+ derive instance newtypeRequestIdleCallbackId :: Newtype RequestIdleCallbackId _
132+ derive instance eqRequestIdleCallbackId :: Eq RequestIdleCallbackId
133+ derive instance ordRequestIdleCallbackId :: Ord RequestIdleCallbackId
134+
135+ foreign import _requestIdleCallback :: forall eff . { timeout :: Int } -> Eff (dom :: DOM | eff ) Unit -> Window -> Eff (dom :: DOM | eff ) Int
136+
137+ -- | Set timeout to `0` to get the same behaviour as when it is `undefined` in
138+ -- | [JavaScript](https://w3c.github.io/requestidlecallback/#h-the-requestidle-callback-method).
139+ requestIdleCallback :: forall eff . { timeout :: Int } -> Eff (dom :: DOM | eff ) Unit -> Window -> Eff (dom :: DOM | eff ) RequestIdleCallbackId
140+ requestIdleCallback opts fn = map RequestIdleCallbackId <<< _requestIdleCallback opts fn
141+
142+ foreign import _cancelIdleCallback :: forall eff . Int -> Window -> Eff (dom :: DOM | eff ) Unit
143+
144+ cancelIdleCallback :: forall eff . RequestIdleCallbackId -> Window -> Eff (dom :: DOM | eff ) Unit
145+ cancelIdleCallback idAF = _cancelIdleCallback (unwrap idAF)
0 commit comments