    module Database.PostgreSQL.Printer
           ( Printer, execPrinter
           , v4HostAddress
           , v6HostAddress
           , netAddress
           ) where

    import Numeric (showInt, showHex)

    import Text.Printer.List (token, list, execPrinter)
    import qualified Text.Printer.List as P
    import Data.PostgreSQL.NetworkAddress
      (V4HostAddress, v4HostAddressOctets, V6HostAddress, v6HostAddressWords, NetAddress (..))

    type Printer a = P.Printer Char a
    type PrintM = P.PrintM Char

    mapShowS :: (a -> ShowS) -> Printer a
    mapShowS :: forall a. (a -> ShowS) -> Printer a
    mapShowS a -> ShowS
    s = Printer Char [Char]
    forall t. Printer t [t]
    list Printer Char [Char] -> (a -> [Char]) -> a -> PrintM Char ()
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . (ShowS -> ShowS
    forall a b. (a -> b) -> a -> b
    $ []) (ShowS -> [Char]) -> (a -> ShowS) -> a -> [Char]
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . a -> ShowS
    s

    dec :: (Integral a, Show a) => Printer a
    dec :: forall a. (Integral a, Show a) => Printer a
    dec = (a -> ShowS) -> Printer a
    forall a. (a -> ShowS) -> Printer a
    mapShowS a -> ShowS
    forall a. Integral a => a -> ShowS
    showInt

    hex :: (Integral a, Show a) => Printer a
    hex :: forall a. (Integral a, Show a) => Printer a
    hex = (a -> ShowS) -> Printer a
    forall a. (a -> ShowS) -> Printer a
    mapShowS a -> ShowS
    forall a. Integral a => a -> ShowS
    showHex

    dot :: PrintM ()
    dot :: PrintM Char ()
    dot = Printer Char Char
    forall t. Printer t t
    token Char
    '.'

    colon :: PrintM ()
    colon :: PrintM Char ()
    colon = Printer Char Char
    forall t. Printer t t
    token Char
    ':'

    slash :: PrintM ()
    slash :: PrintM Char ()
    slash = Printer Char Char
    forall t. Printer t t
    token Char
    '/'

    v4HostAddress :: Printer V4HostAddress
    v4HostAddress :: Printer V4HostAddress
    v4HostAddress V4HostAddress
    ha = do
      let (Word8
    a, Word8
    b, Word8
    c, Word8
    d) = V4HostAddress -> (Word8, Word8, Word8, Word8)
    v4HostAddressOctets V4HostAddress
    ha
      Printer Word8
    forall a. (Integral a, Show a) => Printer a
    dec Word8
    a
      PrintM Char ()
    dot
      Printer Word8
    forall a. (Integral a, Show a) => Printer a
    dec Word8
    b
      PrintM Char ()
    dot
      Printer Word8
    forall a. (Integral a, Show a) => Printer a
    dec Word8
    c
      PrintM Char ()
    dot
      Printer Word8
    forall a. (Integral a, Show a) => Printer a
    dec Word8
    d

    v6HostAddress :: Printer V6HostAddress
    v6HostAddress :: Printer V6HostAddress
    v6HostAddress V6HostAddress
    ha = do
      let (Word16
    a, Word16
    b, Word16
    c, Word16
    d, Word16
    e, Word16
    f, Word16
    g, Word16
    h) = V6HostAddress
    -> (Word16, Word16, Word16, Word16, Word16, Word16, Word16, Word16)
    v6HostAddressWords V6HostAddress
    ha
      Printer Word16
    forall a. (Integral a, Show a) => Printer a
    hex Word16
    a
      PrintM Char ()
    colon
      Printer Word16
    forall a. (Integral a, Show a) => Printer a
    hex Word16
    b
      PrintM Char ()
    colon
      Printer Word16
    forall a. (Integral a, Show a) => Printer a
    hex Word16
    c
      PrintM Char ()
    colon
      Printer Word16
    forall a. (Integral a, Show a) => Printer a
    hex Word16
    d
      PrintM Char ()
    colon
      Printer Word16
    forall a. (Integral a, Show a) => Printer a
    hex Word16
    e
      PrintM Char ()
    colon
      Printer Word16
    forall a. (Integral a, Show a) => Printer a
    hex Word16
    f
      PrintM Char ()
    colon
      Printer Word16
    forall a. (Integral a, Show a) => Printer a
    hex Word16
    g
      PrintM Char ()
    colon
      Printer Word16
    forall a. (Integral a, Show a) => Printer a
    hex Word16
    h

    netAddress :: Printer NetAddress
    netAddress :: Printer NetAddress
    netAddress = Printer NetAddress
    d  where
      d :: Printer NetAddress
    d (NetAddress4 V4HostAddress
    ha Word8
    m) = do
        Printer V4HostAddress
    v4HostAddress V4HostAddress
    ha
        PrintM Char ()
    slash
        Printer Word8
    forall a. (Integral a, Show a) => Printer a
    dec Word8
    m
      d (NetAddress6 V6HostAddress
    v6 Word8
    m) = do
        Printer V6HostAddress
    v6HostAddress V6HostAddress
    v6
        PrintM Char ()
    slash
        Printer Word8
    forall a. (Integral a, Show a) => Printer a
    dec Word8
    m