uni-util-2.2.0.0: Util/LineShow.hs
-- | The LineShow type is simply a list type except that it has
-- Read and Show instances which put the output line by line,
-- preceded by the number of lines. This is useful for data
-- files stored by CVS and similar systems.
module Util.LineShow(
LineShow(..)
) where
newtype LineShow a = LineShow [a]
instance Show a => Show (LineShow a) where
showsPrec prec (LineShow list) acc =
let
showLines [] acc = acc
showLines (h:t) acc = showLines t (showsPrec prec h ('\n':acc))
in
(show (length list))++('\n':showLines list acc)
instance Read a => Read (LineShow a) where
readsPrec prec toRead =
let
readLines 0 acc toRead = [(LineShow acc,toRead)]
readLines nLeft acc toRead =
case readsPrec prec toRead of
[(this,'\n':remainder)] ->
readLines (nLeft-1) (this:acc) remainder
_ -> []
in
case readsPrec prec toRead of
[(nLines,'\n':remainder)] -> readLines (nLines :: Int) [] remainder
_ -> []