{-# LANGUAGE FlexibleInstances    #-}
{-# LANGUAGE OverloadedStrings    #-}
{-# LANGUAGE ScopedTypeVariables  #-}
{-# LANGUAGE TypeSynonymInstances #-}

module Data.Text.ToTextBuilder where

import           Data.Text.Lazy.Builder
import           Data.Text.Lazy.Builder.Int       (decimal)
import           Data.Text.Lazy.Builder.RealFloat (realFloat)

import qualified Data.Text                        as T
import qualified Data.Text.Encoding               as T
import qualified Data.Text.Lazy                   as TL
import qualified Data.Text.Lazy.Encoding          as TL

class ToTextBuilder a where
  toTextBuilder ::  a -> Builder

instance ToTextBuilder Int where
    toTextBuilder = decimal

instance ToTextBuilder Integer where
    toTextBuilder = decimal

instance ToTextBuilder Float where
    toTextBuilder = realFloat

instance ToTextBuilder Double where
    toTextBuilder = realFloat

instance ToTextBuilder Char where
    toTextBuilder = singleton

instance ToTextBuilder T.Text where
    toTextBuilder = fromText

instance ToTextBuilder TL.Text where
    toTextBuilder = fromLazyText

instance ToTextBuilder String where
    toTextBuilder = fromString