packages feed

bytebuild-0.3.9.0: src/Data/Bytes/Builder/Bounded/Class.hs

{-# language DataKinds #-}
{-# language TypeFamilies #-}

module Data.Bytes.Builder.Bounded.Class
  ( ToBoundedBuilder(..)
  ) where

import Data.Int
import Data.Word

import qualified Data.Bytes.Builder.Bounded as Bounded
import qualified GHC.TypeNats as GHC

-- | Variant of To that can be encoded as a builder. Human-readable encodings
-- are used when possible. For example, numbers are encoded an ascii-encoded
-- decimal characters. UTF-8 is preferred for textual types. For types
-- that represent arbitrary bytes (e.g. Bytes, ByteString), the bytes
-- are preserved.
--
-- The goal of this typeclass is to reduce the size of builders produced
-- by quasiquotation.
class ToBoundedBuilder a where
  type BoundedBuilderLength a :: GHC.Nat
  toBuilder :: a -> Bounded.Builder (BoundedBuilderLength a)

-- | Identity
instance ToBoundedBuilder (Bounded.Builder n) where
  type BoundedBuilderLength (Bounded.Builder n) = n
  toBuilder = id

-- | Uses @int64Dec@.
instance ToBoundedBuilder Int64 where
  type BoundedBuilderLength Int64 = 20
  toBuilder = Bounded.int64Dec

-- | Uses @int32Dec@.
instance ToBoundedBuilder Int32 where
  type BoundedBuilderLength Int32 = 11
  toBuilder = Bounded.int32Dec

-- | Uses @int16Dec@.
instance ToBoundedBuilder Int16 where
  type BoundedBuilderLength Int16 = 6
  toBuilder = Bounded.int16Dec

-- | Uses @int8Dec@.
instance ToBoundedBuilder Int8 where
  type BoundedBuilderLength Int8 = 4
  toBuilder = Bounded.int8Dec

-- | Uses @intDec@.
instance ToBoundedBuilder Int where
  type BoundedBuilderLength Int = 20
  toBuilder = Bounded.intDec

-- | Uses @word64Dec@.
instance ToBoundedBuilder Word64 where
  type BoundedBuilderLength Word64 = 19
  toBuilder = Bounded.word64Dec

-- | Uses @word32Dec@.
instance ToBoundedBuilder Word32 where
  type BoundedBuilderLength Word32 = 10
  toBuilder = Bounded.word32Dec

-- | Uses @word16Dec@.
instance ToBoundedBuilder Word16 where
  type BoundedBuilderLength Word16 = 5
  toBuilder = Bounded.word16Dec

-- | Uses @word8Dec@.
instance ToBoundedBuilder Word8 where
  type BoundedBuilderLength Word8 = 3
  toBuilder = Bounded.word8Dec

-- | Uses @wordDec@.
instance ToBoundedBuilder Word where
  type BoundedBuilderLength Word = 19
  toBuilder = Bounded.wordDec