1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
|
{-# LANGUAGE FlexibleInstances, OverlappingInstances, UndecidableInstances, Rank2Types, ScopedTypeVariables #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
--------------------------------------------------------------------
-- | Generic Instance for ToSElem using standard Data.Generic libraries.
--------------------------------------------------------------------}
module Text.StringTemplate.GenericStandard() where
import qualified Data.Map as M
import Text.StringTemplate.Classes
import Text.StringTemplate.Instances()
import Data.Generics.Basics
import Data.Generics.Aliases
import qualified Data.ByteString.Char8 as B
import qualified Data.ByteString.Lazy.Char8 as LB
-- import qualified System.Time as OldTime
-- import System.Locale
-- import Data.Time
import qualified Data.Text as T
import qualified Data.Text.Lazy as LT
gToSElem :: forall a b.(Data a, Stringable b) => a -> SElem b
gToSElem = (\x ->
case (map stripInitUnder (constrFields . toConstr $ x)) of
[] -> LI (STR (showConstr (toConstr x)) :
gmapQ gToSElem x)
fs -> SM (M.fromList (zip fs (gmapQ gToSElem x)))
)
`ext1Q` (\t -> case t of (Just x) -> gToSElem x; _ -> SNull)
`ext1Q` (SM . fmap gToSElem)
`ext1Q` (LI . map gToSElem)
-- `extQ` (toSElem :: OldTime.CalendarTime -> SElem b)
-- `extQ` (toSElem :: OldTime.TimeDiff -> SElem b)
-- `extQ` (toSElem :: TimeOfDay -> SElem b)
-- `extQ` (toSElem :: UTCTime -> SElem b)
-- `extQ` (toSElem :: TimeZone -> SElem b)
-- `extQ` (toSElem :: ZonedTime -> SElem b)
-- `extQ` (toSElem :: Day -> SElem b)
-- `extQ` (toSElem :: LocalTime -> SElem b)
`extQ` (toSElem :: Char -> SElem b)
`extQ` (toSElem :: LB.ByteString -> SElem b)
`extQ` (toSElem :: B.ByteString -> SElem b)
`extQ` (toSElem :: LT.Text -> SElem b)
`extQ` (toSElem :: T.Text -> SElem b)
`extQ` (toSElem :: Bool -> SElem b)
`extQ` (toSElem :: Float -> SElem b)
`extQ` (toSElem :: Double -> SElem b)
`extQ` (toSElem :: Int -> SElem b)
`extQ` (toSElem :: Integer -> SElem b)
`extQ` (toSElem :: String -> SElem b)
instance Data a => ToSElem a
where toSElem = gToSElem
stripInitUnder :: String -> String
stripInitUnder ('_':s) = stripInitUnder s
stripInitUnder s = s
|