{-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE RankNTypes #-} {-# OPTIONS_GHC -fno-warn-tabs #-} {-# OPTIONS_GHC -fno-warn-orphans #-} module Language.LOL.Typing.Lib.Data.Text.Buildable where import Data.Function (($), (.)) import Data.Functor ((<$>)) import Data.Foldable (Foldable(..)) import Data.Monoid (Monoid(..), (<>)) import qualified Data.List as List import Data.String (String) import Data.Text (Text) import Data.Text.Buildable (Buildable(..)) import qualified Data.Text.Lazy as TL import qualified Data.Text.Lazy.Builder as Build import Data.Text.Lazy.Builder (Builder) string :: Buildable a => a -> String string = TL.unpack . Build.toLazyText . build text :: Buildable a => a -> Text text = TL.toStrict . Build.toLazyText . build tuple :: (Foldable f, Buildable a) => f a -> Builder tuple f = "(" <> mconcat (List.intersperse ", " $ foldr ((:). build) [] f) <> ")" list :: (Foldable f, Buildable a) => f a -> Builder list f = "[" <> mconcat (List.intersperse ", " $ foldr ((:). build) [] f) <> "]" unlines :: (Foldable f, Buildable a) => f a -> Builder unlines = mconcat . List.intersperse "\n" . foldr ((:). build) [] indent :: Buildable a => Builder -> a -> Builder indent prefix = mconcat . List.intersperse "\n" . ((prefix <>) . build <$>) . TL.lines . Build.toLazyText . build parens :: Buildable a => a -> Builder parens a = "(" <> build a <> ")" {- instance Buildable a => Buildable [a] where build = list -}