{-# LANGUAGE FlexibleContexts  #-}
{-# LANGUAGE FlexibleInstances #-}

module HaskellWorks.Data.MQuery.Mini where

import HaskellWorks.Data.MQuery.AtLeastSize
import HaskellWorks.Data.MQuery.Micro
import Text.PrettyPrint.ANSI.Leijen

import qualified Data.DList as DL

newtype Mini a = Mini a

instance Pretty (Micro a) => Pretty (Mini [a]) where
  pretty :: Mini [a] -> Doc
pretty (Mini [a]
xs) | [a]
xs [a] -> Int -> Bool
forall a. AtLeastSize a => a -> Int -> Bool
`atLeastSize` Int
11  = String -> Doc
text String
"[" Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> Int -> Doc -> Doc
nest Int
2 ([Micro a] -> Doc
forall a. Pretty a => [a] -> Doc
prettyVs (Int -> [Micro a] -> [Micro a]
forall a. Int -> [a] -> [a]
take Int
10 (a -> Micro a
forall a. a -> Micro a
Micro (a -> Micro a) -> [a] -> [Micro a]
forall a b. (a -> b) -> [a] -> [b]
`map` [a]
xs))) Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> String -> Doc
text String
", ..]"
  pretty (Mini [a]
xs) | [a]
xs [a] -> Int -> Bool
forall a. AtLeastSize a => a -> Int -> Bool
`atLeastSize` Int
1   = String -> Doc
text String
"[" Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> Int -> Doc -> Doc
nest Int
2 ([Micro a] -> Doc
forall a. Pretty a => [a] -> Doc
prettyVs (Int -> [Micro a] -> [Micro a]
forall a. Int -> [a] -> [a]
take Int
10 (a -> Micro a
forall a. a -> Micro a
Micro (a -> Micro a) -> [a] -> [Micro a]
forall a b. (a -> b) -> [a] -> [b]
`map` [a]
xs))) Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> String -> Doc
text String
"]"
  pretty (Mini [a]
_ ) = String -> Doc
text String
"[]"

instance Pretty (Mini a) => Pretty (Mini (DL.DList a)) where
  pretty :: Mini (DList a) -> Doc
pretty (Mini DList a
xs) = [Doc] -> Doc
vcat (Doc -> [Doc] -> [Doc]
punctuate (String -> Doc
text String
",") ((Mini a -> Doc
forall a. Pretty a => a -> Doc
pretty (Mini a -> Doc) -> (a -> Mini a) -> a -> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Mini a
forall a. a -> Mini a
Mini) (a -> Doc) -> [a] -> [Doc]
forall a b. (a -> b) -> [a] -> [b]
`map` Int -> [a] -> [a]
forall a. Int -> [a] -> [a]
take Int
10 (DList a -> [a]
forall a. DList a -> [a]
DL.toList DList a
xs)))