module Reflex.Localize.Class(
GrammarCase(..)
, LocalizedPrint(..)
, defaultLocPrintDyn
) where
import Data.Data
import Data.Text (Text)
import GHC.Generics
import Reflex
import Reflex.Localize.Language
import Reflex.Localize.Monad
data GrammarCase =
Nominative
| Accusative
| Genitive
| Dative
| Instrumental
| Prepositional
deriving (Eq, Ord, Enum, Show, Read, Bounded, Generic, Data)
class LocalizedPrint a where
localizedShow :: Language -> a -> Text
localizedShow = localizedShowCased Nominative
{-# INLINE localizedShow #-}
localizedShowCased :: GrammarCase -> Language -> a -> Text
localizedShowCased _ = localizedShow
{-# INLINE localizedShowCased #-}
localized :: MonadLocalized t m => a -> m (Dynamic t Text)
localized = defaultLocPrintDyn localizedShow
{-# INLINE localized #-}
instance LocalizedPrint Text where
localizedShow _ = id
{-# INLINE localizedShow #-}
localized = pure . pure
{-# INLINE localized #-}
instance (LocalizedPrint a, LocalizedPrint b) => LocalizedPrint (Either a b) where
localizedShow l = either (localizedShow l) (localizedShow l)
{-# INLINE localizedShow #-}
localized = either localized localized
{-# INLINE localized #-}
instance LocalizedPrint () where
localizedShow _ _ = "()"
{-# INLINE localizedShow #-}
localized _ = pure (pure "()")
{-# INLINE localized #-}
defaultLocPrintDyn :: MonadLocalized t m => (Language -> a -> Text) -> a -> m (Dynamic t Text)
defaultLocPrintDyn f v = fmap (fmap (flip f v)) getLanguage