{-# LANGUAGE UndecidableInstances #-}
{-# OPTIONS_GHC -Wno-orphans #-}
module PgSchema.Utils.TF where
import Data.Singletons
import GHC.TypeLits
type family Fst (xs :: (a,b)) :: a where
Fst '(x,_) = x
type family Snd (xs :: (a, b)) :: b where
Snd '(_, y) = y
type family NatToSymbol (n :: Nat) :: Symbol where
NatToSymbol 0 = "0"
NatToSymbol 1 = "1"
NatToSymbol 2 = "2"
NatToSymbol 3 = "3"
NatToSymbol 4 = "4"
NatToSymbol 5 = "5"
NatToSymbol 6 = "6"
NatToSymbol 7 = "7"
NatToSymbol 8 = "8"
NatToSymbol 9 = "9"
NatToSymbol n = AppendSymbol (NatToSymbol (Div n 10)) (NatToSymbol (Mod n 10))
type family (++) (xs :: [a]) (ys :: [a]) :: [a] where
(++) '[] ys = ys
(++) (x ': xs) ys = x ': (xs ++ ys)
type family Null (xs :: [a]) :: Bool where
Null '[] = 'True
Null (x ': xs) = 'False
type family Length (xs :: [a]) :: Nat where
Length '[] = 0
Length (x ': xs) = 1 + Length xs
type family SplitAt (n :: Nat) (xs :: [k]) :: ([k], [k]) where
SplitAt 0 xs = '( '[], xs)
SplitAt n '[] = '( '[], '[])
SplitAt n (x ': xs) = SplitAtHelper x (SplitAt (n - 1) xs)
type family SplitAtHelper (x :: k) (res :: ([k], [k])) :: ([k], [k]) where
SplitAtHelper x '(left, right) = '(x ': left, right)
type family Map1 (f :: a ~> b) (xs :: [a]) :: [b] where
Map1 f '[] = '[]
Map1 f (x ': xs) = Apply f x ': Map1 f xs