{-# LANGUAGE TypeSynonymInstances, GeneralizedNewtypeDeriving, OverloadedStrings #-}
module Text.Localize.State
(
LocState (..),
LocalizeT (..),
runLocalizeT,
setLanguage, withLanguage,
setContext, withContext
) where
import Control.Applicative
import Control.Monad.State
import Control.Monad.Trans
import Text.Localize.Types
data LocState = LocState {
LocState -> Translations
lsTranslations :: Translations,
LocState -> LanguageId
lsLanguage :: LanguageId,
LocState -> Maybe Context
lsContext :: Maybe Context
}
deriving (Int -> LocState -> ShowS
[LocState] -> ShowS
LocState -> LanguageId
(Int -> LocState -> ShowS)
-> (LocState -> LanguageId)
-> ([LocState] -> ShowS)
-> Show LocState
forall a.
(Int -> a -> ShowS)
-> (a -> LanguageId) -> ([a] -> ShowS) -> Show a
showList :: [LocState] -> ShowS
$cshowList :: [LocState] -> ShowS
show :: LocState -> LanguageId
$cshow :: LocState -> LanguageId
showsPrec :: Int -> LocState -> ShowS
$cshowsPrec :: Int -> LocState -> ShowS
Show)
newtype LocalizeT m a = LocalizeT {
LocalizeT m a -> StateT LocState m a
unLocalizeT :: StateT LocState m a
}
deriving (a -> LocalizeT m b -> LocalizeT m a
(a -> b) -> LocalizeT m a -> LocalizeT m b
(forall a b. (a -> b) -> LocalizeT m a -> LocalizeT m b)
-> (forall a b. a -> LocalizeT m b -> LocalizeT m a)
-> Functor (LocalizeT m)
forall a b. a -> LocalizeT m b -> LocalizeT m a
forall a b. (a -> b) -> LocalizeT m a -> LocalizeT m b
forall (m :: * -> *) a b.
Functor m =>
a -> LocalizeT m b -> LocalizeT m a
forall (m :: * -> *) a b.
Functor m =>
(a -> b) -> LocalizeT m a -> LocalizeT m b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
<$ :: a -> LocalizeT m b -> LocalizeT m a
$c<$ :: forall (m :: * -> *) a b.
Functor m =>
a -> LocalizeT m b -> LocalizeT m a
fmap :: (a -> b) -> LocalizeT m a -> LocalizeT m b
$cfmap :: forall (m :: * -> *) a b.
Functor m =>
(a -> b) -> LocalizeT m a -> LocalizeT m b
Functor, Functor (LocalizeT m)
a -> LocalizeT m a
Functor (LocalizeT m)
-> (forall a. a -> LocalizeT m a)
-> (forall a b.
LocalizeT m (a -> b) -> LocalizeT m a -> LocalizeT m b)
-> (forall a b c.
(a -> b -> c) -> LocalizeT m a -> LocalizeT m b -> LocalizeT m c)
-> (forall a b. LocalizeT m a -> LocalizeT m b -> LocalizeT m b)
-> (forall a b. LocalizeT m a -> LocalizeT m b -> LocalizeT m a)
-> Applicative (LocalizeT m)
LocalizeT m a -> LocalizeT m b -> LocalizeT m b
LocalizeT m a -> LocalizeT m b -> LocalizeT m a
LocalizeT m (a -> b) -> LocalizeT m a -> LocalizeT m b
(a -> b -> c) -> LocalizeT m a -> LocalizeT m b -> LocalizeT m c
forall a. a -> LocalizeT m a
forall a b. LocalizeT m a -> LocalizeT m b -> LocalizeT m a
forall a b. LocalizeT m a -> LocalizeT m b -> LocalizeT m b
forall a b. LocalizeT m (a -> b) -> LocalizeT m a -> LocalizeT m b
forall a b c.
(a -> b -> c) -> LocalizeT m a -> LocalizeT m b -> LocalizeT m c
forall (m :: * -> *). Monad m => Functor (LocalizeT m)
forall (m :: * -> *) a. Monad m => a -> LocalizeT m a
forall (m :: * -> *) a b.
Monad m =>
LocalizeT m a -> LocalizeT m b -> LocalizeT m a
forall (m :: * -> *) a b.
Monad m =>
LocalizeT m a -> LocalizeT m b -> LocalizeT m b
forall (m :: * -> *) a b.
Monad m =>
LocalizeT m (a -> b) -> LocalizeT m a -> LocalizeT m b
forall (m :: * -> *) a b c.
Monad m =>
(a -> b -> c) -> LocalizeT m a -> LocalizeT m b -> LocalizeT m c
forall (f :: * -> *).
Functor f
-> (forall a. a -> f a)
-> (forall a b. f (a -> b) -> f a -> f b)
-> (forall a b c. (a -> b -> c) -> f a -> f b -> f c)
-> (forall a b. f a -> f b -> f b)
-> (forall a b. f a -> f b -> f a)
-> Applicative f
<* :: LocalizeT m a -> LocalizeT m b -> LocalizeT m a
$c<* :: forall (m :: * -> *) a b.
Monad m =>
LocalizeT m a -> LocalizeT m b -> LocalizeT m a
*> :: LocalizeT m a -> LocalizeT m b -> LocalizeT m b
$c*> :: forall (m :: * -> *) a b.
Monad m =>
LocalizeT m a -> LocalizeT m b -> LocalizeT m b
liftA2 :: (a -> b -> c) -> LocalizeT m a -> LocalizeT m b -> LocalizeT m c
$cliftA2 :: forall (m :: * -> *) a b c.
Monad m =>
(a -> b -> c) -> LocalizeT m a -> LocalizeT m b -> LocalizeT m c
<*> :: LocalizeT m (a -> b) -> LocalizeT m a -> LocalizeT m b
$c<*> :: forall (m :: * -> *) a b.
Monad m =>
LocalizeT m (a -> b) -> LocalizeT m a -> LocalizeT m b
pure :: a -> LocalizeT m a
$cpure :: forall (m :: * -> *) a. Monad m => a -> LocalizeT m a
$cp1Applicative :: forall (m :: * -> *). Monad m => Functor (LocalizeT m)
Applicative, Applicative (LocalizeT m)
a -> LocalizeT m a
Applicative (LocalizeT m)
-> (forall a b.
LocalizeT m a -> (a -> LocalizeT m b) -> LocalizeT m b)
-> (forall a b. LocalizeT m a -> LocalizeT m b -> LocalizeT m b)
-> (forall a. a -> LocalizeT m a)
-> Monad (LocalizeT m)
LocalizeT m a -> (a -> LocalizeT m b) -> LocalizeT m b
LocalizeT m a -> LocalizeT m b -> LocalizeT m b
forall a. a -> LocalizeT m a
forall a b. LocalizeT m a -> LocalizeT m b -> LocalizeT m b
forall a b. LocalizeT m a -> (a -> LocalizeT m b) -> LocalizeT m b
forall (m :: * -> *). Monad m => Applicative (LocalizeT m)
forall (m :: * -> *) a. Monad m => a -> LocalizeT m a
forall (m :: * -> *) a b.
Monad m =>
LocalizeT m a -> LocalizeT m b -> LocalizeT m b
forall (m :: * -> *) a b.
Monad m =>
LocalizeT m a -> (a -> LocalizeT m b) -> LocalizeT m b
forall (m :: * -> *).
Applicative m
-> (forall a b. m a -> (a -> m b) -> m b)
-> (forall a b. m a -> m b -> m b)
-> (forall a. a -> m a)
-> Monad m
return :: a -> LocalizeT m a
$creturn :: forall (m :: * -> *) a. Monad m => a -> LocalizeT m a
>> :: LocalizeT m a -> LocalizeT m b -> LocalizeT m b
$c>> :: forall (m :: * -> *) a b.
Monad m =>
LocalizeT m a -> LocalizeT m b -> LocalizeT m b
>>= :: LocalizeT m a -> (a -> LocalizeT m b) -> LocalizeT m b
$c>>= :: forall (m :: * -> *) a b.
Monad m =>
LocalizeT m a -> (a -> LocalizeT m b) -> LocalizeT m b
$cp1Monad :: forall (m :: * -> *). Monad m => Applicative (LocalizeT m)
Monad, Monad (LocalizeT m)
Monad (LocalizeT m)
-> (forall a. IO a -> LocalizeT m a) -> MonadIO (LocalizeT m)
IO a -> LocalizeT m a
forall a. IO a -> LocalizeT m a
forall (m :: * -> *).
Monad m -> (forall a. IO a -> m a) -> MonadIO m
forall (m :: * -> *). MonadIO m => Monad (LocalizeT m)
forall (m :: * -> *) a. MonadIO m => IO a -> LocalizeT m a
liftIO :: IO a -> LocalizeT m a
$cliftIO :: forall (m :: * -> *) a. MonadIO m => IO a -> LocalizeT m a
$cp1MonadIO :: forall (m :: * -> *). MonadIO m => Monad (LocalizeT m)
MonadIO, MonadState LocState)
instance Monad m => Localized (LocalizeT m) where
getTranslations :: LocalizeT m Translations
getTranslations = (LocState -> Translations) -> LocalizeT m Translations
forall s (m :: * -> *) a. MonadState s m => (s -> a) -> m a
gets LocState -> Translations
lsTranslations
getLanguage :: LocalizeT m LanguageId
getLanguage = (LocState -> LanguageId) -> LocalizeT m LanguageId
forall s (m :: * -> *) a. MonadState s m => (s -> a) -> m a
gets LocState -> LanguageId
lsLanguage
getContext :: LocalizeT m (Maybe Context)
getContext = (LocState -> Maybe Context) -> LocalizeT m (Maybe Context)
forall s (m :: * -> *) a. MonadState s m => (s -> a) -> m a
gets LocState -> Maybe Context
lsContext
runLocalizeT :: Monad m => LocalizeT m a -> LocState -> m a
runLocalizeT :: LocalizeT m a -> LocState -> m a
runLocalizeT LocalizeT m a
actions LocState
st = StateT LocState m a -> LocState -> m a
forall (m :: * -> *) s a. Monad m => StateT s m a -> s -> m a
evalStateT (LocalizeT m a -> StateT LocState m a
forall (m :: * -> *) a. LocalizeT m a -> StateT LocState m a
unLocalizeT LocalizeT m a
actions) LocState
st
setLanguage :: Monad m => LanguageId -> LocalizeT m ()
setLanguage :: LanguageId -> LocalizeT m ()
setLanguage LanguageId
lang = (LocState -> LocState) -> LocalizeT m ()
forall s (m :: * -> *). MonadState s m => (s -> s) -> m ()
modify ((LocState -> LocState) -> LocalizeT m ())
-> (LocState -> LocState) -> LocalizeT m ()
forall a b. (a -> b) -> a -> b
$ \LocState
st -> LocState
st {lsLanguage :: LanguageId
lsLanguage = LanguageId
lang}
withLanguage :: Monad m => LanguageId -> LocalizeT m a -> LocalizeT m a
withLanguage :: LanguageId -> LocalizeT m a -> LocalizeT m a
withLanguage LanguageId
lang LocalizeT m a
actions = do
LanguageId
oldLang <- (LocState -> LanguageId) -> LocalizeT m LanguageId
forall s (m :: * -> *) a. MonadState s m => (s -> a) -> m a
gets LocState -> LanguageId
lsLanguage
LanguageId -> LocalizeT m ()
forall (m :: * -> *). Monad m => LanguageId -> LocalizeT m ()
setLanguage LanguageId
lang
a
result <- LocalizeT m a
actions
LanguageId -> LocalizeT m ()
forall (m :: * -> *). Monad m => LanguageId -> LocalizeT m ()
setLanguage LanguageId
oldLang
a -> LocalizeT m a
forall (m :: * -> *) a. Monad m => a -> m a
return a
result
setContext :: Monad m => Maybe Context -> LocalizeT m ()
setContext :: Maybe Context -> LocalizeT m ()
setContext Maybe Context
ctxt = (LocState -> LocState) -> LocalizeT m ()
forall s (m :: * -> *). MonadState s m => (s -> s) -> m ()
modify ((LocState -> LocState) -> LocalizeT m ())
-> (LocState -> LocState) -> LocalizeT m ()
forall a b. (a -> b) -> a -> b
$ \LocState
st -> LocState
st {lsContext :: Maybe Context
lsContext = Maybe Context
ctxt}
withContext :: Monad m => Maybe Context -> LocalizeT m a -> LocalizeT m a
withContext :: Maybe Context -> LocalizeT m a -> LocalizeT m a
withContext Maybe Context
ctxt LocalizeT m a
actions = do
Maybe Context
oldContext <- (LocState -> Maybe Context) -> LocalizeT m (Maybe Context)
forall s (m :: * -> *) a. MonadState s m => (s -> a) -> m a
gets LocState -> Maybe Context
lsContext
Maybe Context -> LocalizeT m ()
forall (m :: * -> *). Monad m => Maybe Context -> LocalizeT m ()
setContext Maybe Context
ctxt
a
result <- LocalizeT m a
actions
Maybe Context -> LocalizeT m ()
forall (m :: * -> *). Monad m => Maybe Context -> LocalizeT m ()
setContext Maybe Context
oldContext
a -> LocalizeT m a
forall (m :: * -> *) a. Monad m => a -> m a
return a
result