{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE OverloadedStrings #-}
module HaskellWorks.Data.MQuery.Row where
import Prettyprinter
import qualified Data.DList as DL
type MaxChars = Int
data Row a = Row MaxChars a
instance Pretty a => Pretty (Row (DL.DList a)) where
pretty :: forall ann. Row (DList a) -> Doc ann
pretty (Row MaxChars
_ DList a
xs) = [Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
vcat ((Doc ann
"==> " Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<>) (Doc ann -> Doc ann) -> [Doc ann] -> [Doc ann]
forall a b. (a -> b) -> [a] -> [b]
`map` [Doc ann]
forall ann. [Doc ann]
prettyRows)
where prettyRows :: [Doc ann]
prettyRows :: forall ann. [Doc ann]
prettyRows = (a -> Doc ann) -> [a] -> [Doc ann]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> Doc ann
forall ann. a -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty ([a] -> [Doc ann]) -> [a] -> [Doc ann]
forall a b. (a -> b) -> a -> b
$ DList a -> [a]
forall a. DList a -> [a]
DL.toList DList a
xs
prettyRowOfString :: Show a => Row (DL.DList a) -> Doc ann
prettyRowOfString :: forall a ann. Show a => Row (DList a) -> Doc ann
prettyRowOfString (Row MaxChars
_ DList a
xs) = [Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
vcat ((Doc ann
"==> " Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<>) (Doc ann -> Doc ann) -> [Doc ann] -> [Doc ann]
forall a b. (a -> b) -> [a] -> [b]
`map` [Doc ann]
forall ann. [Doc ann]
prettyRows)
where prettyRows :: [Doc ann]
prettyRows :: forall ann. [Doc ann]
prettyRows = (String -> Doc ann
forall ann. String -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty (String -> Doc ann) -> (a -> String) -> a -> Doc ann
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> String
forall a. Show a => a -> String
show) (a -> Doc ann) -> [a] -> [Doc ann]
forall a b. (a -> b) -> [a] -> [b]
`map` DList a -> [a]
forall a. DList a -> [a]
DL.toList DList a
xs