module Reflex.Localize.Monad
  (
    MonadLocalized(..)
  ) where

import Control.Monad.Reader
import Reflex
import Reflex.Localize.Language

-- | ===========================================================================
-- |                        Monad Localized
-- | ===========================================================================

-- | API for language localization support
class (Reflex t, Monad m) => MonadLocalized t m | m -> t where
  -- | Switch frontend language
  setLanguage :: Language -> m ()
  -- | Switch frontend language by event
  setLanguageE :: Event t (Language) -> m ()
  -- | Get language of the frontend
  getLanguage :: m (Dynamic t Language)

instance {-# OVERLAPPABLE #-} MonadLocalized t m => MonadLocalized t (ReaderT e m) where
  setLanguage   = lift . setLanguage
  setLanguageE  = lift . setLanguageE
  getLanguage   = lift getLanguage
  {-# INLINE setLanguage #-}
  {-# INLINE setLanguageE #-}
  {-# INLINE getLanguage #-}