{-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE RankNTypes #-} {-# OPTIONS_GHC -fno-warn-tabs #-} {-# OPTIONS_GHC -fno-warn-orphans #-} module Hcompta.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.Eq (Eq(..)) import qualified Data.Text as 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) <> "]" words :: (Foldable f, Buildable a) => f a -> Builder words f = mconcat (List.intersperse " " $ foldr ((:). build) [] f) words_quoted :: (Foldable f, Buildable a) => f a -> Builder words_quoted f = mconcat (List.intersperse " " $ foldr ((:) . quote) [] f) where quote a = let t = text a in if Text.any (== ' ') t then "'"<>build t<>"'" else build t 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 -}