lol-typing-1.20160822: Language/LOL/Typing/Lib/Data/Text/Buildable.hs
{-# 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
-}