packages feed

ghcjs-base-0.8.0.0: JavaScript/Web/Storage.hs

{-# 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
  "((x) => { return x.length; })"       js_getLength      :: Storage -> IO Int
foreign import javascript unsafe
  "((x,y) => { return y.key(x); })"     js_getIndex       :: Int -> Storage -> IO JSVal
foreign import javascript unsafe
  "((x,y) => { return y.getItem(x); })" js_getItem        :: JSString -> Storage -> IO JSVal
foreign import javascript safe
  "((x,y,z) => { x.setItem(x,y); })"    js_setItem        :: JSString -> JSString -> Storage -> IO ()
foreign import javascript unsafe
  "((x,y) => { y.removeItem(x); })"     js_removeItem     :: JSString -> Storage -> IO ()
foreign import javascript unsafe
  "((x) => { x.clear(); })"             js_clear          :: Storage -> IO ()