{-# 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.JSON
import Miso.String (MisoString)
getStorageCommon
:: FromJSON b
=> (t -> IO (Maybe JSVal))
-> t
-> IO (Either MisoString b)
getStorageCommon :: forall b t.
FromJSON b =>
(t -> IO (Maybe JSVal)) -> t -> IO (Either MisoString b)
getStorageCommon t -> IO (Maybe JSVal)
f t
key = do
result <- t -> IO (Maybe JSVal)
f t
key
case result of
Maybe JSVal
Nothing ->
Either MisoString b -> IO (Either MisoString b)
forall a. a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (MisoString -> Either MisoString b
forall a b. a -> Either a b
Left MisoString
"Not Found")
Just JSVal
v -> do
s <- JSVal -> IO MisoString
forall a. FromJSVal a => JSVal -> IO a
fromJSValUnchecked JSVal
v
pure (eitherDecode s)
getSessionStorage
:: FromJSON model
=> MisoString
-> IO (Either MisoString model)
getSessionStorage :: forall model.
FromJSON model =>
MisoString -> IO (Either MisoString model)
getSessionStorage =
(MisoString -> IO (Maybe JSVal))
-> MisoString -> IO (Either MisoString model)
forall b t.
FromJSON b =>
(t -> IO (Maybe JSVal)) -> t -> IO (Either MisoString b)
getStorageCommon ((MisoString -> IO (Maybe JSVal))
-> MisoString -> IO (Either MisoString model))
-> (MisoString -> IO (Maybe JSVal))
-> MisoString
-> IO (Either MisoString model)
forall a b. (a -> b) -> a -> b
$ \MisoString
t -> do
s <- IO Storage
sessionStorage
r <- getItem s t
fromJSVal r
getLocalStorage
:: FromJSON model
=> MisoString
-> IO (Either MisoString model)
getLocalStorage :: forall model.
FromJSON model =>
MisoString -> IO (Either MisoString model)
getLocalStorage = (MisoString -> IO (Maybe JSVal))
-> MisoString -> IO (Either MisoString model)
forall b t.
FromJSON b =>
(t -> IO (Maybe JSVal)) -> t -> IO (Either MisoString b)
getStorageCommon ((MisoString -> IO (Maybe JSVal))
-> MisoString -> IO (Either MisoString model))
-> (MisoString -> IO (Maybe JSVal))
-> MisoString
-> IO (Either MisoString model)
forall a b. (a -> b) -> a -> b
$ \MisoString
t -> do
s <- IO Storage
localStorage
r <- getItem s t
fromJSVal r
setLocalStorage
:: ToJSON model
=> MisoString
-> model
-> IO ()
setLocalStorage :: forall model. ToJSON model => MisoString -> model -> IO ()
setLocalStorage MisoString
key model
model = do
s <- IO Storage
localStorage
setItem s key (encode model)
setSessionStorage
:: ToJSON model
=> MisoString
-> model
-> IO ()
setSessionStorage :: forall model. ToJSON model => MisoString -> model -> IO ()
setSessionStorage MisoString
key model
model = do
s <- IO Storage
sessionStorage
setItem s key (encode model)
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)