{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE AllowAmbiguousTypes #-}
module Data.TypedEncoding.Common.Class.Common where
import Data.TypedEncoding.Common.Types.Common
import qualified Data.ByteString.Char8 as B
import qualified Data.ByteString.Lazy.Char8 as BL
import qualified Data.Text as T
import qualified Data.Text.Lazy as TL
import Data.Proxy
import qualified Data.List as L
import GHC.TypeLits
class SymbolList (xs::[Symbol]) where
symbolVals :: [String]
instance SymbolList '[] where
symbolVals :: [String]
symbolVals = []
instance (SymbolList xs, KnownSymbol x) => SymbolList (x ': xs) where
symbolVals :: [String]
symbolVals = Proxy @Symbol x -> String
forall (n :: Symbol) (proxy :: Symbol -> *).
KnownSymbol n =>
proxy n -> String
symbolVal (Proxy @Symbol x
forall k (t :: k). Proxy @k t
Proxy :: Proxy x) String -> [String] -> [String]
forall a. a -> [a] -> [a]
: SymbolList xs => [String]
forall (xs :: [Symbol]). SymbolList xs => [String]
symbolVals @xs
symbolVals_ :: forall xs . SymbolList xs => Proxy xs -> [String]
symbolVals_ :: Proxy @[Symbol] xs -> [String]
symbolVals_ Proxy @[Symbol] xs
_ = SymbolList xs => [String]
forall (xs :: [Symbol]). SymbolList xs => [String]
symbolVals @xs
class Displ x where
displ :: x -> String
instance Displ [EncAnn] where
displ :: [String] -> String
displ [String]
x = String
"[" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String -> [String] -> String
forall a. [a] -> [[a]] -> [a]
L.intercalate String
"," [String]
x String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"]"
instance Displ T.Text where
displ :: Text -> String
displ Text
x = String
"(Text " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Text -> String
T.unpack Text
x String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
")"
instance Displ TL.Text where
displ :: Text -> String
displ Text
x = String
"(TL.Text " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Text -> String
TL.unpack Text
x String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
")"
instance Displ B.ByteString where
displ :: ByteString -> String
displ ByteString
x = String
"(ByteString " String -> String -> String
forall a. [a] -> [a] -> [a]
++ ByteString -> String
B.unpack ByteString
x String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
")"
instance Displ BL.ByteString where
displ :: ByteString -> String
displ ByteString
x = String
"(ByteString " String -> String -> String
forall a. [a] -> [a] -> [a]
++ ByteString -> String
BL.unpack ByteString
x String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
")"
instance Displ String where
displ :: String -> String
displ String
x = String
"(String " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
x String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
")"
instance (SymbolList xs) => Displ (Proxy xs) where
displ :: Proxy @[Symbol] xs -> String
displ Proxy @[Symbol] xs
_ = [String] -> String
forall x. Displ x => x -> String
displ ([String] -> String) -> [String] -> String
forall a b. (a -> b) -> a -> b
$ SymbolList xs => [String]
forall (xs :: [Symbol]). SymbolList xs => [String]
symbolVals @xs