{-# LANGUAGE CPP #-}
module PgSchema.Utils.Internal where

import Data.Kind
import Data.List as L
import Data.Singletons
import Data.String
import Data.Text as T
import Prelude as P

#ifdef DEBUG
import Debug.Trace
#endif


fromText :: IsString t => Text -> t
fromText :: forall t. IsString t => Text -> t
fromText = String -> t
forall a. IsString a => String -> a
fromString (String -> t) -> (Text -> String) -> Text -> t
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> String
T.unpack
{-# INLINE fromText #-}

show' :: (IsString b, Show a) => a -> b
show' :: forall b a. (IsString b, Show a) => a -> b
show' = String -> b
forall a. IsString a => String -> a
fromString (String -> b) -> (a -> String) -> a -> b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> String
forall a. Show a => a -> String
P.show
{-# INLINE show' #-}

intercalate' :: Monoid a => a -> [a] -> a
intercalate' :: forall a. Monoid a => a -> [a] -> a
intercalate' a
a = [a] -> a
forall a. Monoid a => [a] -> a
mconcat ([a] -> a) -> ([a] -> [a]) -> [a] -> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> [a] -> [a]
forall a. a -> [a] -> [a]
L.intersperse a
a
{-# INLINE intercalate' #-}

unlines' :: (Monoid a, IsString a) => [a] -> a
unlines' :: forall a. (Monoid a, IsString a) => [a] -> a
unlines' = a -> [a] -> a
forall a. Monoid a => a -> [a] -> a
intercalate' a
"\n"
{-# INLINE unlines' #-}

type ToStar a = (SingKind (KindOf a), SingI a)

trace' :: String -> a -> a
traceShow' :: Show a => a -> b -> b
#ifdef DEBUG
trace' = trace . (<> "\n============") . ("=== Debug ===\n" <>)
traceShow' a = trace $ "=== Debug ===\n" <> P.show a <> "\n============"
#else
trace' :: forall a. String -> a -> a
trace' String
_ = a -> a
forall a. a -> a
id
traceShow' :: forall a b. Show a => a -> b -> b
traceShow' a
_ = b -> b
forall a. a -> a
id
#endif
{-# INLINE trace' #-}
{-# INLINE traceShow' #-}

type family IsMaybe (x :: Type) :: Bool where
  IsMaybe (Maybe a) = 'True
  IsMaybe a = 'False

type family UnMaybe (x :: Type) :: Type where
  UnMaybe (Maybe a) = a
  UnMaybe a = a