-- | Utilities for printing lists
module Numeric.Probability.PrintList where


import Data.List (intersperse)


----------------------------------------------------------------------
-- PRINT UTILITIES
----------------------------------------------------------------------

newtype Lines a = Lines [a]

instance Show a => Show (Lines a) where
  show :: Lines a -> String
show (Lines [a]
xs) = forall a b. ([a], [a], [a]) -> (b -> [a]) -> [b] -> [a]
printList (String
"",String
"\n",String
"") forall a. Show a => a -> String
show [a]
xs

asLines :: [a] -> Lines a
asLines :: forall a. [a] -> Lines a
asLines = forall a. [a] -> Lines a
Lines


showNQ :: Show a => a -> String
showNQ :: forall a. Show a => a -> String
showNQ = forall a. (a -> Bool) -> [a] -> [a]
filter (Char
'"'forall a. Eq a => a -> a -> Bool
/=) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Show a => a -> String
show

indent :: Int -> Int -> [Char]
indent :: Int -> Int -> String
indent Int
i Int
l = forall a. Int -> [a] -> [a]
take (Int
iforall a. Num a => a -> a -> a
*Int
l) (forall a. a -> [a]
repeat Char
' ')

printList :: ([a],[a],[a]) -> (b -> [a]) -> [b] -> [a]
printList :: forall a b. ([a], [a], [a]) -> (b -> [a]) -> [b] -> [a]
printList ([a]
sep0,[a]
sep1,[a]
sep2) b -> [a]
f [b]
xs =
   [a]
sep0forall a. [a] -> [a] -> [a]
++forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat (forall a. a -> [a] -> [a]
intersperse [a]
sep1 (forall a b. (a -> b) -> [a] -> [b]
map b -> [a]
f [b]
xs))forall a. [a] -> [a] -> [a]
++[a]
sep2


asTuple, asSeq, asList, asSet, asLisp,
  asString, asPlain, asPlain' :: (a -> [Char]) -> [a] -> [Char]

asTuple :: forall a. (a -> String) -> [a] -> String
asTuple = forall a b. ([a], [a], [a]) -> (b -> [a]) -> [b] -> [a]
printList (String
"(",String
",",String
")")
asSeq :: forall a. (a -> String) -> [a] -> String
asSeq   = forall a b. ([a], [a], [a]) -> (b -> [a]) -> [b] -> [a]
printList (String
"",String
",",String
"")
asList :: forall a. (a -> String) -> [a] -> String
asList  = forall a b. ([a], [a], [a]) -> (b -> [a]) -> [b] -> [a]
printList (String
"[",String
",",String
"]")
asSet :: forall a. (a -> String) -> [a] -> String
asSet   = forall a b. ([a], [a], [a]) -> (b -> [a]) -> [b] -> [a]
printList (String
"{",String
",",String
"}")
asLisp :: forall a. (a -> String) -> [a] -> String
asLisp  = forall a b. ([a], [a], [a]) -> (b -> [a]) -> [b] -> [a]
printList (String
"(",String
" ",String
")")
asPlain :: forall a. (a -> String) -> [a] -> String
asPlain  a -> String
f [a]
xs = if forall (t :: * -> *) a. Foldable t => t a -> Bool
null [a]
xs then String
"" else forall a b. ([a], [a], [a]) -> (b -> [a]) -> [b] -> [a]
printList (String
" ",String
" ",String
"") a -> String
f [a]
xs
asPlain' :: forall a. (a -> String) -> [a] -> String
asPlain' a -> String
f [a]
xs = if forall (t :: * -> *) a. Foldable t => t a -> Bool
null [a]
xs then String
"" else forall a b. ([a], [a], [a]) -> (b -> [a]) -> [b] -> [a]
printList (String
"",String
" ",String
"") a -> String
f [a]
xs
asString :: forall a. (a -> String) -> [a] -> String
asString = forall a b. ([a], [a], [a]) -> (b -> [a]) -> [b] -> [a]
printList (String
"",String
"",String
"")
-- asLines = printList ["","\n",""]

asCases :: Int -> (a -> [Char]) -> [a] -> [Char]
asCases :: forall a. Int -> (a -> String) -> [a] -> String
asCases Int
l =
   let ind :: String
ind = Int -> Int -> String
indent Int
4 Int
l
   in  forall a b. ([a], [a], [a]) -> (b -> [a]) -> [b] -> [a]
printList (String
"\n"forall a. [a] -> [a] -> [a]
++String
indforall a. [a] -> [a] -> [a]
++String
"   ",String
"\n"forall a. [a] -> [a] -> [a]
++String
indforall a. [a] -> [a] -> [a]
++String
" | ",String
"")

asDefs :: [Char] -> (a -> [Char]) -> [a] -> [Char]
asDefs :: forall a. String -> (a -> String) -> [a] -> String
asDefs String
n = forall a b. ([a], [a], [a]) -> (b -> [a]) -> [b] -> [a]
printList (String
"\n"forall a. [a] -> [a] -> [a]
++String
n,String
"\n"forall a. [a] -> [a] -> [a]
++String
n,String
"\n")

asParagraphs :: (a -> [Char]) -> [a] -> [Char]
asParagraphs :: forall a. (a -> String) -> [a] -> String
asParagraphs = forall a b. ([a], [a], [a]) -> (b -> [a]) -> [b] -> [a]
printList (String
"\n",String
"\n\n",String
"\n")