{-|
Module      : Util.Pretty
Description : Utilities for Pretty Printing.

License     : BSD3
Maintainer  : The Idris Community.
-}

{-# LANGUAGE MultiParamTypeClasses #-}

module Util.Pretty (
    module Text.PrettyPrint.Annotated.Leijen
  , Sized(..)
  , nestingSize
  , Pretty(..)
  ) where

--import Text.PrettyPrint.HughesPJ
import Text.PrettyPrint.Annotated.Leijen

-- A rough notion of size for pretty printing various types.
class Sized a where
  size :: a -> Int

instance (Sized a, Sized b) => Sized (a, b) where
  size :: (a, b) -> Int
size (a
left, b
right) = Int
1 Int -> Int -> Int
forall a. Num a => a -> a -> a
+ a -> Int
forall a. Sized a => a -> Int
size a
left Int -> Int -> Int
forall a. Num a => a -> a -> a
+ b -> Int
forall a. Sized a => a -> Int
size b
right

instance Sized a => Sized [a] where
  size :: [a] -> Int
size = [Int] -> Int
forall a. Num a => [a] -> a
forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
sum ([Int] -> Int) -> ([a] -> [Int]) -> [a] -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> Int) -> [a] -> [Int]
forall a b. (a -> b) -> [a] -> [b]
map a -> Int
forall a. Sized a => a -> Int
size

nestingSize :: Int
nestingSize :: Int
nestingSize = Int
1

class Pretty a ty where
  pretty :: a -> Doc ty