module Data.Buildable
(
Buildable (..)
, BuildFrom (..)
, CanBuildFrom
, singleton
, (<|)
, (|>)
, Chunked (..)
, ChunkedBuilder (..)
, BigEndian (..)
, LittleEndian (..)
, Dec (..)
, Hex (..)
, HexFixed (..)
, Char7 (..)
, Char8 (..)
, Utf8 (..)
, Utf16 (..)
, Utf32 (..)
) where
import Data.Monoid (Monoid (..), (<>))
import Data.String (IsString (..))
import qualified Data.DList as DL
import qualified Data.ByteString as SB
import qualified Data.ByteString.Lazy as LB
import qualified Data.ByteString.Lazy.Builder as B
import qualified Data.ByteString.Lazy.Builder.ASCII as B
import Data.Int
import Data.Word
import qualified Data.Text as ST
import qualified Data.Text.Encoding as ST
import qualified Data.Text.Lazy as LT
import qualified Data.Text.Lazy.Builder as T
import qualified Data.Text.Lazy.Encoding as LT
import qualified Data.Sequence as S
class (BuildFrom (Builder a) a, BuildFrom (Builder a) (Unit a))
=> Buildable a where
type Unit a
type Builder a
build :: Builder a -> a
type CanBuildFrom b a = (Buildable b, BuildFrom (Builder b) a)
singleton :: (CanBuildFrom b a) => a -> b
singleton = build . fromValue
class (Monoid b) => BuildFrom b a where
fromValue :: a -> b
prepend :: a -> b -> b
prepend a b = fromValue a <> b
append :: b -> a -> b
append b a = b <> fromValue a
(<|) :: (BuildFrom b a) => a -> b -> b
(<|) = prepend
infixr 4 <|
(|>) :: (BuildFrom b a) => b -> a -> b
(|>) = append
infixl 5 |>
instance Buildable [a] where
type Unit [a] = a
type Builder [a] = DL.DList a
build = DL.toList
instance BuildFrom [a] a where
fromValue = (: [])
prepend = (:)
instance BuildFrom (DL.DList a) [a] where
fromValue = DL.fromList
instance BuildFrom (DL.DList a) a where
fromValue = DL.singleton
prepend = DL.cons
append = DL.snoc
instance BuildFrom (DL.DList [a]) a where
fromValue = DL.singleton . (: [])
prepend = DL.cons . (: [])
append b = DL.snoc b . (: [])
newtype Chunked a = Chunks { unChunk :: [a]}
deriving (Eq, Ord, Show, Read, Monoid, Functor)
newtype ChunkedBuilder a = CB { unCB :: DL.DList a }
deriving (Monoid, Functor)
instance (Buildable b) => Buildable (Chunked b) where
type Unit (Chunked b) = b
type Builder (Chunked b) = ChunkedBuilder b
build = Chunks . DL.toList . unCB
instance (Buildable b) => BuildFrom (ChunkedBuilder b) (Chunked b) where
fromValue = CB . DL.fromList . unChunk
instance (CanBuildFrom b a) => BuildFrom (ChunkedBuilder b) a where
fromValue = CB . DL.singleton . singleton
prepend a (CB b) = CB (singleton a `DL.cons` b)
append (CB b) a = CB (b `DL.snoc` singleton a)
instance Buildable SB.ByteString where
type Unit SB.ByteString = Word8
type Builder SB.ByteString = B.Builder
build = LB.toStrict . B.toLazyByteString
instance Buildable LB.ByteString where
type Unit LB.ByteString = Word8
type Builder LB.ByteString = B.Builder
build = B.toLazyByteString
newtype BigEndian a = BE { unBE :: a }
deriving ( Eq, Ord, Show, Read, Bounded, Enum
, Num, Integral, Real, RealFloat, RealFrac, Floating, Fractional)
newtype LittleEndian a = LE { unLE :: a }
deriving ( Eq, Ord, Show, Read, Bounded, Enum
, Num, Integral, Real, RealFloat, RealFrac, Floating, Fractional)
newtype Dec a = Dec { unDec :: a }
deriving ( Eq, Ord, Show, Read, Bounded, Enum
, Num, Integral, Real, RealFloat, RealFrac, Floating, Fractional)
newtype Hex a = Hex { unHex :: a }
deriving ( Eq, Ord, Show, Read, Bounded, Enum
, Num, Integral, Real, RealFloat, RealFrac, Floating, Fractional)
newtype HexFixed a = HexFixed { unHexFixed :: a }
deriving ( Eq, Ord, Show, Read, Bounded, Enum
, Num, Integral, Real, RealFloat, RealFrac, Floating, Fractional)
instance BuildFrom B.Builder SB.ByteString where
fromValue = B.byteString
instance BuildFrom B.Builder (HexFixed SB.ByteString) where
fromValue = B.byteStringHexFixed . unHexFixed
instance BuildFrom B.Builder LB.ByteString where
fromValue = B.lazyByteString
instance BuildFrom B.Builder (HexFixed LB.ByteString) where
fromValue = B.lazyByteStringHexFixed . unHexFixed
instance BuildFrom B.Builder Word8 where
fromValue = B.word8
instance BuildFrom B.Builder (Dec Word8) where
fromValue = B.word8Dec . unDec
instance BuildFrom B.Builder (Hex Word8) where
fromValue = B.word8Hex . unHex
instance BuildFrom B.Builder (HexFixed Word8) where
fromValue = B.word8HexFixed . unHexFixed
instance BuildFrom B.Builder Int8 where
fromValue = B.int8
instance BuildFrom B.Builder (Dec Int8) where
fromValue = B.int8Dec . unDec
instance BuildFrom B.Builder (HexFixed Int8) where
fromValue = B.int8HexFixed . unHexFixed
instance BuildFrom B.Builder (BigEndian Double) where
fromValue = B.doubleBE . unBE
instance BuildFrom B.Builder (LittleEndian Double) where
fromValue = B.doubleLE . unLE
instance BuildFrom B.Builder (Dec Double) where
fromValue = B.doubleDec . unDec
instance BuildFrom B.Builder (HexFixed Double) where
fromValue = B.doubleHexFixed . unHexFixed
instance BuildFrom B.Builder (BigEndian Float) where
fromValue = B.floatBE . unBE
instance BuildFrom B.Builder (LittleEndian Float) where
fromValue = B.floatLE . unLE
instance BuildFrom B.Builder (Dec Float) where
fromValue = B.floatDec . unDec
instance BuildFrom B.Builder (HexFixed Float) where
fromValue = B.floatHexFixed . unHexFixed
instance BuildFrom B.Builder (BigEndian Int16) where
fromValue = B.int16BE . unBE
instance BuildFrom B.Builder (LittleEndian Int16) where
fromValue = B.int16LE . unLE
instance BuildFrom B.Builder (Dec Int16) where
fromValue = B.int16Dec . unDec
instance BuildFrom B.Builder (HexFixed Int16) where
fromValue = B.int16HexFixed . unHexFixed
instance BuildFrom B.Builder (BigEndian Int32) where
fromValue = B.int32BE . unBE
instance BuildFrom B.Builder (LittleEndian Int32) where
fromValue = B.int32LE . unLE
instance BuildFrom B.Builder (Dec Int32) where
fromValue = B.int32Dec . unDec
instance BuildFrom B.Builder (HexFixed Int32) where
fromValue = B.int32HexFixed . unHexFixed
instance BuildFrom B.Builder (BigEndian Int64) where
fromValue = B.int64BE . unBE
instance BuildFrom B.Builder (LittleEndian Int64) where
fromValue = B.int64LE . unLE
instance BuildFrom B.Builder (Dec Int64) where
fromValue = B.int64Dec . unDec
instance BuildFrom B.Builder (HexFixed Int64) where
fromValue = B.int64HexFixed . unHexFixed
instance BuildFrom B.Builder (Dec Int) where
fromValue = B.intDec . unDec
instance BuildFrom B.Builder (Dec Integer) where
fromValue = B.integerDec . unDec
instance BuildFrom B.Builder (BigEndian Word16) where
fromValue = B.word16BE . unBE
instance BuildFrom B.Builder (LittleEndian Word16) where
fromValue = B.word16LE . unLE
instance BuildFrom B.Builder (Dec Word16) where
fromValue = B.word16Dec . unDec
instance BuildFrom B.Builder (Hex Word16) where
fromValue = B.word16Hex . unHex
instance BuildFrom B.Builder (HexFixed Word16) where
fromValue = B.word16HexFixed . unHexFixed
instance BuildFrom B.Builder (BigEndian Word32) where
fromValue = B.word32BE . unBE
instance BuildFrom B.Builder (LittleEndian Word32) where
fromValue = B.word32LE . unLE
instance BuildFrom B.Builder (Dec Word32) where
fromValue = B.word32Dec . unDec
instance BuildFrom B.Builder (Hex Word32) where
fromValue = B.word32Hex . unHex
instance BuildFrom B.Builder (HexFixed Word32) where
fromValue = B.word32HexFixed . unHexFixed
instance BuildFrom B.Builder (BigEndian Word64) where
fromValue = B.word64BE . unBE
instance BuildFrom B.Builder (LittleEndian Word64) where
fromValue = B.word64LE . unLE
instance BuildFrom B.Builder (Dec Word64) where
fromValue = B.word64Dec . unDec
instance BuildFrom B.Builder (Hex Word64) where
fromValue = B.word64Hex . unHex
instance BuildFrom B.Builder (HexFixed Word64) where
fromValue = B.word64HexFixed . unHexFixed
instance BuildFrom B.Builder (Dec Word) where
fromValue = B.wordDec . unDec
instance BuildFrom B.Builder (Hex Word) where
fromValue = B.wordHex . unHex
newtype Char7 a = Char7 { unChar7 :: a }
deriving (Eq, Ord, Show, Read, Bounded, Enum)
instance (IsString a) => IsString (Char7 a) where
fromString = Char7 . fromString
newtype Char8 a = Char8 { unChar8 :: a }
deriving (Eq, Ord, Show, Read, Bounded, Enum)
instance (IsString a) => IsString (Char8 a) where
fromString = Char8 . fromString
newtype Utf8 a = Utf8 { unUtf8 :: a }
deriving (Eq, Ord, Show, Read, Bounded, Enum)
instance (IsString a) => IsString (Utf8 a) where
fromString = Utf8 . fromString
newtype Utf16 a = Utf16 { unUtf16 :: a }
deriving (Eq, Ord, Show, Read, Bounded, Enum)
instance (IsString a) => IsString (Utf16 a) where
fromString = Utf16 . fromString
newtype Utf32 a = Utf32 { unUtf32 :: a }
deriving (Eq, Ord, Show, Read, Bounded, Enum)
instance (IsString a) => IsString (Utf32 a) where
fromString = Utf32 . fromString
instance BuildFrom B.Builder (Char7 Char) where
fromValue = B.char7 . unChar7
instance BuildFrom B.Builder (Char8 Char) where
fromValue = B.char8 . unChar8
instance BuildFrom B.Builder (Utf8 Char) where
fromValue = B.charUtf8 . unUtf8
instance BuildFrom B.Builder (Char7 String) where
fromValue = B.string7 . unChar7
instance BuildFrom B.Builder (Char8 String) where
fromValue = B.string8 . unChar8
instance BuildFrom B.Builder (Utf8 String) where
fromValue = B.stringUtf8 . unUtf8
instance BuildFrom B.Builder (Utf8 ST.Text) where
fromValue = B.byteString . ST.encodeUtf8 . unUtf8
instance BuildFrom B.Builder (BigEndian (Utf16 ST.Text)) where
fromValue = B.byteString . ST.encodeUtf16BE . unUtf16 . unBE
instance BuildFrom B.Builder (Utf16 (BigEndian ST.Text)) where
fromValue = B.byteString . ST.encodeUtf16BE . unBE . unUtf16
instance BuildFrom B.Builder (LittleEndian (Utf16 ST.Text)) where
fromValue = B.byteString . ST.encodeUtf16LE . unUtf16 . unLE
instance BuildFrom B.Builder (Utf16 (LittleEndian ST.Text)) where
fromValue = B.byteString . ST.encodeUtf16LE . unLE . unUtf16
instance BuildFrom B.Builder (BigEndian (Utf32 ST.Text)) where
fromValue = B.byteString . ST.encodeUtf32BE . unUtf32 . unBE
instance BuildFrom B.Builder (Utf32 (BigEndian ST.Text)) where
fromValue = B.byteString . ST.encodeUtf32BE . unBE . unUtf32
instance BuildFrom B.Builder (LittleEndian (Utf32 ST.Text)) where
fromValue = B.byteString . ST.encodeUtf32LE . unUtf32 . unLE
instance BuildFrom B.Builder (Utf32 (LittleEndian ST.Text)) where
fromValue = B.byteString . ST.encodeUtf32LE . unLE . unUtf32
instance BuildFrom B.Builder (Utf8 LT.Text) where
fromValue = B.lazyByteString . LT.encodeUtf8 . unUtf8
instance BuildFrom B.Builder (BigEndian (Utf16 LT.Text)) where
fromValue = B.lazyByteString . LT.encodeUtf16BE . unUtf16 . unBE
instance BuildFrom B.Builder (Utf16 (BigEndian LT.Text)) where
fromValue = B.lazyByteString . LT.encodeUtf16BE . unBE . unUtf16
instance BuildFrom B.Builder (LittleEndian (Utf16 LT.Text)) where
fromValue = B.lazyByteString . LT.encodeUtf16LE . unUtf16 . unLE
instance BuildFrom B.Builder (Utf16 (LittleEndian LT.Text)) where
fromValue = B.lazyByteString . LT.encodeUtf16LE . unLE . unUtf16
instance BuildFrom B.Builder (BigEndian (Utf32 LT.Text)) where
fromValue = B.lazyByteString . LT.encodeUtf32BE . unUtf32 . unBE
instance BuildFrom B.Builder (Utf32 (BigEndian LT.Text)) where
fromValue = B.lazyByteString . LT.encodeUtf32BE . unBE . unUtf32
instance BuildFrom B.Builder (LittleEndian (Utf32 LT.Text)) where
fromValue = B.lazyByteString . LT.encodeUtf32LE . unUtf32 . unLE
instance BuildFrom B.Builder (Utf32 (LittleEndian LT.Text)) where
fromValue = B.lazyByteString . LT.encodeUtf32LE . unLE . unUtf32
instance Buildable ST.Text where
type Unit ST.Text = Char
type Builder ST.Text = T.Builder
build = LT.toStrict . T.toLazyText
instance Buildable LT.Text where
type Unit LT.Text = Char
type Builder LT.Text = T.Builder
build = T.toLazyText
instance BuildFrom T.Builder ST.Text where
fromValue = T.fromText
instance BuildFrom T.Builder LT.Text where
fromValue = T.fromLazyText
instance BuildFrom T.Builder Char where
fromValue = T.singleton
instance BuildFrom T.Builder String where
fromValue = T.fromString
instance BuildFrom T.Builder (Char8 SB.ByteString) where
fromValue = T.fromText . ST.decodeLatin1 . unChar8
instance BuildFrom T.Builder (Utf8 SB.ByteString) where
fromValue = T.fromText . ST.decodeUtf8 . unUtf8
instance BuildFrom T.Builder (BigEndian (Utf16 SB.ByteString)) where
fromValue = T.fromText . ST.decodeUtf16BE . unUtf16 . unBE
instance BuildFrom T.Builder (Utf16 (BigEndian SB.ByteString)) where
fromValue = T.fromText . ST.decodeUtf16BE . unBE . unUtf16
instance BuildFrom T.Builder (LittleEndian (Utf16 SB.ByteString)) where
fromValue = T.fromText . ST.decodeUtf16LE . unUtf16 . unLE
instance BuildFrom T.Builder (Utf16 (LittleEndian SB.ByteString)) where
fromValue = T.fromText . ST.decodeUtf16LE . unLE . unUtf16
instance BuildFrom T.Builder (BigEndian (Utf32 SB.ByteString)) where
fromValue = T.fromText . ST.decodeUtf32BE . unUtf32 . unBE
instance BuildFrom T.Builder (Utf32 (BigEndian SB.ByteString)) where
fromValue = T.fromText . ST.decodeUtf32BE . unBE . unUtf32
instance BuildFrom T.Builder (LittleEndian (Utf32 SB.ByteString)) where
fromValue = T.fromText . ST.decodeUtf32LE . unUtf32 . unLE
instance BuildFrom T.Builder (Utf32 (LittleEndian SB.ByteString)) where
fromValue = T.fromText . ST.decodeUtf32LE . unLE . unUtf32
instance BuildFrom T.Builder (Char8 LB.ByteString) where
fromValue = T.fromLazyText . LT.decodeLatin1 . unChar8
instance BuildFrom T.Builder (Utf8 LB.ByteString) where
fromValue = T.fromLazyText . LT.decodeUtf8 . unUtf8
instance BuildFrom T.Builder (BigEndian (Utf16 LB.ByteString)) where
fromValue = T.fromLazyText . LT.decodeUtf16BE . unUtf16 . unBE
instance BuildFrom T.Builder (Utf16 (BigEndian LB.ByteString)) where
fromValue = T.fromLazyText . LT.decodeUtf16BE . unBE . unUtf16
instance BuildFrom T.Builder (LittleEndian (Utf16 LB.ByteString)) where
fromValue = T.fromLazyText . LT.decodeUtf16LE . unUtf16 . unLE
instance BuildFrom T.Builder (Utf16 (LittleEndian LB.ByteString)) where
fromValue = T.fromLazyText . LT.decodeUtf16LE . unLE . unUtf16
instance BuildFrom T.Builder (BigEndian (Utf32 LB.ByteString)) where
fromValue = T.fromLazyText . LT.decodeUtf32BE . unUtf32 . unBE
instance BuildFrom T.Builder (Utf32 (BigEndian LB.ByteString)) where
fromValue = T.fromLazyText . LT.decodeUtf32BE . unBE . unUtf32
instance BuildFrom T.Builder (LittleEndian (Utf32 LB.ByteString)) where
fromValue = T.fromLazyText . LT.decodeUtf32LE . unUtf32 . unLE
instance BuildFrom T.Builder (Utf32 (LittleEndian LB.ByteString)) where
fromValue = T.fromLazyText . LT.decodeUtf32LE . unLE . unUtf32
instance Buildable (S.Seq a) where
type Unit (S.Seq a) = a
type Builder (S.Seq a) = S.Seq a
build = id
instance BuildFrom (S.Seq a) (S.Seq a) where
fromValue = id
instance BuildFrom (S.Seq a) a where
fromValue = S.singleton
prepend = (S.<|)
append = (S.|>)
instance BuildFrom (S.Seq a) [a] where
fromValue = S.fromList