{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
module Miso.Storage
(
getLocalStorage
, setLocalStorage
, removeLocalStorage
, clearLocalStorage
, localStorageLength
, getSessionStorage
, setSessionStorage
, removeSessionStorage
, clearSessionStorage
, sessionStorageLength
) where
import Control.Monad (void)
import Miso.DSL
import Miso.String (MisoString)
getSessionStorage
:: MisoString
-> IO (Maybe MisoString)
getSessionStorage :: Text -> IO (Maybe Text)
getSessionStorage Text
key = do
JSVal -> IO (Maybe Text)
forall a. FromJSVal a => JSVal -> IO a
fromJSValUnchecked (JSVal -> IO (Maybe Text)) -> IO JSVal -> IO (Maybe Text)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< (Storage -> Text -> IO JSVal) -> Text -> Storage -> IO JSVal
forall a b c. (a -> b -> c) -> b -> a -> c
flip Storage -> Text -> IO JSVal
getItem Text
key (Storage -> IO JSVal) -> IO Storage -> IO JSVal
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< IO Storage
sessionStorage
getLocalStorage
:: MisoString
-> IO (Maybe MisoString)
getLocalStorage :: Text -> IO (Maybe Text)
getLocalStorage Text
key =
JSVal -> IO (Maybe Text)
forall a. FromJSVal a => JSVal -> IO a
fromJSValUnchecked (JSVal -> IO (Maybe Text)) -> IO JSVal -> IO (Maybe Text)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< (Storage -> Text -> IO JSVal) -> Text -> Storage -> IO JSVal
forall a b c. (a -> b -> c) -> b -> a -> c
flip Storage -> Text -> IO JSVal
getItem Text
key (Storage -> IO JSVal) -> IO Storage -> IO JSVal
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< IO Storage
localStorage
setLocalStorage
:: MisoString
-> MisoString
-> IO ()
setLocalStorage :: Text -> Text -> IO ()
setLocalStorage Text
key Text
value = do
s <- IO Storage
localStorage
setItem s key value
setSessionStorage
:: MisoString
-> MisoString
-> IO ()
setSessionStorage :: Text -> Text -> IO ()
setSessionStorage Text
key Text
value = do
s <- IO Storage
sessionStorage
setItem s key value
removeLocalStorage
:: MisoString
-> IO ()
removeLocalStorage :: Text -> IO ()
removeLocalStorage Text
key = do
s <- IO Storage
localStorage
removeItem s key
removeSessionStorage
:: MisoString
-> IO ()
removeSessionStorage :: Text -> IO ()
removeSessionStorage Text
key = do
s <- IO Storage
sessionStorage
removeItem s key
clearLocalStorage :: IO ()
clearLocalStorage :: IO ()
clearLocalStorage = Storage -> IO ()
clear (Storage -> IO ()) -> IO Storage -> IO ()
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< IO Storage
localStorage
clearSessionStorage :: IO ()
clearSessionStorage :: IO ()
clearSessionStorage = Storage -> IO ()
clear (Storage -> IO ()) -> IO Storage -> IO ()
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< IO Storage
sessionStorage
localStorageLength :: IO Int
localStorageLength :: IO Int
localStorageLength = JSVal -> IO Int
forall a. FromJSVal a => JSVal -> IO a
fromJSValUnchecked (JSVal -> IO Int) -> IO JSVal -> IO Int
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< IO Storage
localStorage IO Storage -> Text -> IO JSVal
forall o. ToObject o => o -> Text -> IO JSVal
! Text
"length"
sessionStorageLength :: IO Int
sessionStorageLength :: IO Int
sessionStorageLength = JSVal -> IO Int
forall a. FromJSVal a => JSVal -> IO a
fromJSValUnchecked (JSVal -> IO Int) -> IO JSVal -> IO Int
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< IO Storage
sessionStorage IO Storage -> Text -> IO JSVal
forall o. ToObject o => o -> Text -> IO JSVal
! Text
"length"
localStorage :: IO Storage
localStorage :: IO Storage
localStorage = JSVal -> Storage
Storage (JSVal -> Storage) -> IO JSVal -> IO Storage
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Text -> IO JSVal
jsg Text
"window" IO JSVal -> Text -> IO JSVal
forall o. ToObject o => o -> Text -> IO JSVal
! Text
"localStorage")
sessionStorage :: IO Storage
sessionStorage :: IO Storage
sessionStorage = JSVal -> Storage
Storage (JSVal -> Storage) -> IO JSVal -> IO Storage
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Text -> IO JSVal
jsg Text
"window" IO JSVal -> Text -> IO JSVal
forall o. ToObject o => o -> Text -> IO JSVal
! Text
"sessionStorage")
getItem :: Storage -> MisoString -> IO JSVal
getItem :: Storage -> Text -> IO JSVal
getItem (Storage JSVal
s) Text
key = JSVal
s JSVal -> Text -> [Text] -> IO JSVal
forall object args.
(ToObject object, ToArgs args) =>
object -> Text -> args -> IO JSVal
# Text
"getItem" ([Text] -> IO JSVal) -> [Text] -> IO JSVal
forall a b. (a -> b) -> a -> b
$ [Text
key]
removeItem :: Storage -> MisoString -> IO ()
removeItem :: Storage -> Text -> IO ()
removeItem (Storage JSVal
s) Text
key = IO JSVal -> IO ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (IO JSVal -> IO ()) -> IO JSVal -> IO ()
forall a b. (a -> b) -> a -> b
$ JSVal
s JSVal -> Text -> [Text] -> IO JSVal
forall object args.
(ToObject object, ToArgs args) =>
object -> Text -> args -> IO JSVal
# Text
"removeItem" ([Text] -> IO JSVal) -> [Text] -> IO JSVal
forall a b. (a -> b) -> a -> b
$ [Text
key]
setItem :: Storage -> MisoString -> MisoString -> IO ()
setItem :: Storage -> Text -> Text -> IO ()
setItem (Storage JSVal
s) Text
key Text
val = do
_ <- JSVal
s JSVal -> Text -> (Text, Text) -> IO JSVal
forall object args.
(ToObject object, ToArgs args) =>
object -> Text -> args -> IO JSVal
# Text
"setItem" ((Text, Text) -> IO JSVal) -> (Text, Text) -> IO JSVal
forall a b. (a -> b) -> a -> b
$ (Text
key, Text
val)
pure ()
clear :: Storage -> IO ()
clear :: Storage -> IO ()
clear (Storage JSVal
s) = do
_ <- JSVal
s JSVal -> Text -> () -> IO JSVal
forall object args.
(ToObject object, ToArgs args) =>
object -> Text -> args -> IO JSVal
# Text
"clear" (() -> IO JSVal) -> () -> IO JSVal
forall a b. (a -> b) -> a -> b
$ ()
pure ()
newtype Storage = Storage JSVal
deriving (Storage -> IO Object
(Storage -> IO Object) -> ToObject Storage
forall a. (a -> IO Object) -> ToObject a
$ctoObject :: Storage -> IO Object
toObject :: Storage -> IO Object
ToObject, Storage -> IO JSVal
(Storage -> IO JSVal) -> ToJSVal Storage
forall a. (a -> IO JSVal) -> ToJSVal a
$ctoJSVal :: Storage -> IO JSVal
toJSVal :: Storage -> IO JSVal
ToJSVal)