module Clr.TypeString where
import Clr.ListTuple
import Clr.Types
import Data.List(intercalate)
import Data.Kind
import GHC.TypeLits
import GHC.Prim
class TString t where
tString :: forall t . String
instance (KnownSymbol name, TString gt) => TString (T name gt) where
tString = symbolVal' (proxy# :: Proxy# name) ++ (tString @gt)
instance TString () where
tString = ""
instance TString '[] where
tString = ""
instance (TString x, TStrings xs, (KnownNat (1 + ListSize xs))) => TString (x ': xs) where
tString = "`" ++ show (natVal' (proxy# :: Proxy# (1 + ListSize xs))) ++ "[" ++ intercalate "," (tString @x : tStrings @xs) ++ "]"
class TStrings ts where
tStrings :: forall gt' . [String]
instance TStrings '[] where
tStrings = []
instance (TString x, TStrings xs) => TStrings (x ': xs) where
tStrings = tString @x : tStrings @xs
tStringGet :: forall t . (TString t) => String
tStringGet = "get_" ++ tString @t
tStringSet :: forall t . (TString t) => String
tStringSet = "set_" ++ tString @t