{-# 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 :: MisoString -> IO (Maybe MisoString)
getSessionStorage MisoString
key = do
JSVal -> IO (Maybe MisoString)
forall a. FromJSVal a => JSVal -> IO a
fromJSValUnchecked (JSVal -> IO (Maybe MisoString))
-> IO JSVal -> IO (Maybe MisoString)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< (Storage -> MisoString -> IO JSVal)
-> MisoString -> Storage -> IO JSVal
forall a b c. (a -> b -> c) -> b -> a -> c
flip Storage -> MisoString -> IO JSVal
getItem MisoString
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 :: MisoString -> IO (Maybe MisoString)
getLocalStorage MisoString
key =
JSVal -> IO (Maybe MisoString)
forall a. FromJSVal a => JSVal -> IO a
fromJSValUnchecked (JSVal -> IO (Maybe MisoString))
-> IO JSVal -> IO (Maybe MisoString)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< (Storage -> MisoString -> IO JSVal)
-> MisoString -> Storage -> IO JSVal
forall a b c. (a -> b -> c) -> b -> a -> c
flip Storage -> MisoString -> IO JSVal
getItem MisoString
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 :: MisoString -> MisoString -> IO ()
setLocalStorage MisoString
key MisoString
value = do
s <- IO Storage
localStorage
setItem s key value
setSessionStorage
:: MisoString
-> MisoString
-> IO ()
setSessionStorage :: MisoString -> MisoString -> IO ()
setSessionStorage MisoString
key MisoString
value = do
s <- IO Storage
sessionStorage
setItem s key value
removeLocalStorage
:: MisoString
-> IO ()
removeLocalStorage :: MisoString -> IO ()
removeLocalStorage MisoString
key = do
s <- IO Storage
localStorage
removeItem s key
removeSessionStorage
:: MisoString
-> IO ()
removeSessionStorage :: MisoString -> IO ()
removeSessionStorage MisoString
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 -> MisoString -> IO JSVal
forall o. ToObject o => o -> MisoString -> IO JSVal
! MisoString
"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 -> MisoString -> IO JSVal
forall o. ToObject o => o -> MisoString -> IO JSVal
! MisoString
"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
<$> (MisoString -> IO JSVal
jsg MisoString
"window" IO JSVal -> MisoString -> IO JSVal
forall o. ToObject o => o -> MisoString -> IO JSVal
! MisoString
"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
<$> (MisoString -> IO JSVal
jsg MisoString
"window" IO JSVal -> MisoString -> IO JSVal
forall o. ToObject o => o -> MisoString -> IO JSVal
! MisoString
"sessionStorage")
getItem :: Storage -> MisoString -> IO JSVal
getItem :: Storage -> MisoString -> IO JSVal
getItem (Storage JSVal
s) MisoString
key = JSVal
s JSVal -> MisoString -> [MisoString] -> IO JSVal
forall object args.
(ToObject object, ToArgs args) =>
object -> MisoString -> args -> IO JSVal
# MisoString
"getItem" ([MisoString] -> IO JSVal) -> [MisoString] -> IO JSVal
forall a b. (a -> b) -> a -> b
$ [MisoString
key]
removeItem :: Storage -> MisoString -> IO ()
removeItem :: Storage -> MisoString -> IO ()
removeItem (Storage JSVal
s) MisoString
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 -> MisoString -> [MisoString] -> IO JSVal
forall object args.
(ToObject object, ToArgs args) =>
object -> MisoString -> args -> IO JSVal
# MisoString
"removeItem" ([MisoString] -> IO JSVal) -> [MisoString] -> IO JSVal
forall a b. (a -> b) -> a -> b
$ [MisoString
key]
setItem :: Storage -> MisoString -> MisoString -> IO ()
setItem :: Storage -> MisoString -> MisoString -> IO ()
setItem (Storage JSVal
s) MisoString
key MisoString
val = do
_ <- JSVal
s JSVal -> MisoString -> (MisoString, MisoString) -> IO JSVal
forall object args.
(ToObject object, ToArgs args) =>
object -> MisoString -> args -> IO JSVal
# MisoString
"setItem" ((MisoString, MisoString) -> IO JSVal)
-> (MisoString, MisoString) -> IO JSVal
forall a b. (a -> b) -> a -> b
$ (MisoString
key, MisoString
val)
pure ()
clear :: Storage -> IO ()
clear :: Storage -> IO ()
clear (Storage JSVal
s) = do
_ <- JSVal
s JSVal -> MisoString -> () -> IO JSVal
forall object args.
(ToObject object, ToArgs args) =>
object -> MisoString -> args -> IO JSVal
# MisoString
"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)