{-# LANGUAGE FlexibleInstances    #-}
{-# LANGUAGE OverloadedStrings    #-}
{-# LANGUAGE TemplateHaskell      #-}
{-# LANGUAGE UndecidableInstances #-}
module Marvin.Interpolate.String where


import           Data.List
import           Data.Monoid
import qualified Data.Text                 as T
import qualified Data.Text.Lazy            as L
import           Language.Haskell.TH
import           Language.Haskell.TH.Quote
import           Marvin.Interpolate
import           Util


class ShowStr a where
    showStr :: a -> String
    showListStr :: [a] -> String
    showListStr l = "[" <> intercalate ", " (map showStr l) <> "]"

instance ShowStr Char where
    showStr = show
    showListStr = id

instance ShowStr T.Text where
    showStr = T.unpack

instance ShowStr L.Text where
    showStr = L.unpack

instance {-# OVERLAPPABLE #-} Show a => ShowStr a where
    showStr = show


isS :: String -> Q Exp
isS = return . interpolateInto (VarE 'show)


iS :: QuasiQuoter
iS = mqq { quoteExp = isS }