{-# LANGUAGE ForeignFunctionInterface, JavaScriptFFI #-}
module JavaScript.Web.Storage ( localStorage
, sessionStorage
, Storage
, getLength
, getIndex
, getItem
, setItem
, removeItem
, clear
) where
import GHCJS.Types
import Data.JSString
import Data.JSString.Internal.Type
import JavaScript.Web.Storage.Internal
localStorage :: Storage
localStorage = js_localStorage
{-# INLINE localStorage #-}
sessionStorage :: Storage
sessionStorage = js_sessionStorage
{-# INLINE sessionStorage #-}
getLength :: Storage -> IO Int
getLength s = js_getLength s
{-# INLINE getLength #-}
getIndex :: Int -> Storage -> IO (Maybe JSString)
getIndex i s = do
r <- js_getIndex i s
return $ if isNull r then Nothing else Just (JSString r)
{-# INLINE getIndex #-}
getItem :: JSString -> Storage -> IO (Maybe JSString)
getItem key s = do
r <- js_getItem key s
return $ if isNull r then Nothing else Just (JSString r)
{-# INLINE getItem #-}
setItem :: JSString -> JSString -> Storage -> IO ()
setItem key val s = js_setItem key val s
{-# INLINE setItem #-}
removeItem :: JSString -> Storage -> IO ()
removeItem key s = js_removeItem key s
{-# INLINE removeItem #-}
clear :: Storage -> IO ()
clear s = js_clear s
{-# INLINE clear #-}
foreign import javascript unsafe
"window.localStorage" js_localStorage :: Storage
foreign import javascript unsafe
"window.sessionStorage" js_sessionStorage :: Storage
foreign import javascript unsafe
"$1.length" js_getLength :: Storage -> IO Int
foreign import javascript unsafe
"$2.key($1)" js_getIndex :: Int -> Storage -> IO JSVal
foreign import javascript unsafe
"$2.getItem($1)" js_getItem :: JSString -> Storage -> IO JSVal
foreign import javascript safe
"$3.setItem($1,$2)" js_setItem :: JSString -> JSString -> Storage -> IO ()
foreign import javascript unsafe
"$2.removeItem($1)" js_removeItem :: JSString -> Storage -> IO ()
foreign import javascript unsafe
"$1.clear();" js_clear :: Storage -> IO ()