{-# LANGUAGE CPP
            ,MultiParamTypeClasses
            ,FlexibleInstances #-}

module Data.ListLike.Text.Builder

where

#if !MIN_VERSION_base(4,8,0)
import           Control.Applicative
#endif
import           Control.DeepSeq (NFData(rnf))
import qualified Data.Text.Lazy.Builder as Builder
import           Data.ListLike.Base as LL
import           Data.ListLike.FoldableLL as LL
import           Data.ListLike.IO
import           Data.ListLike.String as LL
import           Data.ListLike.Text.TextLazy ()
import           Data.String (IsString(fromString))

instance FoldableLL Builder.Builder Char where
    foldl f r0 = LL.foldl f r0 . Builder.toLazyText
    foldr f r0 = LL.foldr f r0 . Builder.toLazyText

instance ListLike Builder.Builder Char where
    singleton = Builder.singleton
    uncons b = case LL.uncons (Builder.toLazyText b) of
                 Nothing -> Nothing
                 Just (c, s) -> Just (c, Builder.fromLazyText s)
    null = LL.null . Builder.toLazyText

instance ListLikeIO Builder.Builder Char where
    hGetLine h = Builder.fromLazyText <$> hGetLine h
    hGetContents h = Builder.fromLazyText <$> hGetContents h
    hGet h n = Builder.fromLazyText <$> hGet h n
    hGetNonBlocking h n = Builder.fromLazyText <$> hGetNonBlocking h n
    hPutStr h = hPutStr h . Builder.toLazyText

instance StringLike Builder.Builder where
    toString = toString . Builder.toLazyText
    fromString = Builder.fromLazyText . LL.fromString

instance NFData Builder.Builder where
    rnf = rnf . Builder.toLazyText