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

module HaskellWorks.Data.MQuery.Mini where

import HaskellWorks.Data.MQuery.AtLeastSize
import HaskellWorks.Data.MQuery.Micro
import Prettyprinter

import qualified Data.DList as DL

newtype Mini a = Mini a

instance Pretty (Micro a) => Pretty (Mini [a]) where
  pretty :: forall ann. Mini [a] -> Doc ann
pretty (Mini [a]
xs) | [a]
xs [a] -> Int -> Bool
forall a. AtLeastSize a => a -> Int -> Bool
`atLeastSize` Int
11  = Doc ann
"[" Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Int -> Doc ann -> Doc ann
forall ann. Int -> Doc ann -> Doc ann
nest Int
2 ([Micro a] -> Doc ann
forall a ann. Pretty a => [a] -> Doc ann
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 ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
", ..]"
  pretty (Mini [a]
xs) | [a]
xs [a] -> Int -> Bool
forall a. AtLeastSize a => a -> Int -> Bool
`atLeastSize` Int
1   = Doc ann
"[" Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Int -> Doc ann -> Doc ann
forall ann. Int -> Doc ann -> Doc ann
nest Int
2 ([Micro a] -> Doc ann
forall a ann. Pretty a => [a] -> Doc ann
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 ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"]"
  pretty (Mini [a]
_ ) = Doc ann
"[]"

instance Pretty (Mini a) => Pretty (Mini (DL.DList a)) where
  pretty :: forall ann. Mini (DList a) -> Doc ann
pretty (Mini DList a
xs) = [Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
vcat (Doc ann -> [Doc ann] -> [Doc ann]
forall ann. Doc ann -> [Doc ann] -> [Doc ann]
punctuate Doc ann
"," ((Mini a -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Mini a -> Doc ann
pretty (Mini a -> Doc ann) -> (a -> Mini a) -> a -> Doc ann
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Mini a
forall a. a -> Mini a
Mini) (a -> Doc ann) -> [a] -> [Doc ann]
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)))