-- | 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
            _ -> []