{-# 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
  -- TODO implement max chars for Row
  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