packages feed

ansiform-0.7.8.5: src/Ansiform/Internal/Sample.hs

module Ansiform.Internal.Sample where

--------------------------------------------------------------------------------

-- | Inspection helpers for debugging values.
class Sample a where
  sample :: a -> IO ()
  sample x = putStrLn $ sampleShow 0 x

  sampleShow :: Int -> a -> String

sampleFormat :: Sample a => String -> Int -> a -> String
sampleFormat s n c = s ++ "\n" ++ sampleShow n c


-- Basic Instances
--------------------------------------------------------------------------------

instance (Sample a, Show a) => Sample (Maybe a) where
  sampleShow _ Nothing = "Nothing"
  sampleShow _ (Just a) = "Just " ++ sampleShow 0 a

instance Sample a => Sample [a] where
  sample xs = putStrLn $ sampleShow (-1) xs
  sampleShow n xs | n < 0 = showCList 0 | otherwise = showCList (n+2)
                where showCList n' = showContentList (zip xs [0..]) n'

-- Support function to assist in showing list of content types.
showContentList :: Sample a => [(a,Int)] -> Int -> String
showContentList [] _ = ""
showContentList ((i,0):is) n = showSpaces n ++ sampleShow n i ++ showContentList is n
showContentList ((i,_):is) n = "\n" ++ showSpaces n ++ sampleShow n i ++ showContentList is n

showSpaces :: Int -> String
showSpaces n = replicate n ' '