uni-util-2.2.0.0: Util/QuickReadShow.hs
{-# LANGUAGE ExistentialQuantification #-}
-- | QuickReadShow is designed for the rapid manufacture of read/show
-- instances. To create such an instance you need to (a) instance
-- quickRead; (b) instance Read/Show using a particular template.
-- (Before April 2004 (b) was not part of the code; it now has to
-- be added to deal with tougher GHC restrictions on overlapping instances.)
module Util.QuickReadShow(
WrapRead(WrapRead),
QuickRead(quickRead),
qRead,
WrapShow(WrapShow),
QuickShow(quickShow),
qShow
) where
data WrapRead toRead = forall read . Read read => WrapRead (read -> toRead)
class QuickRead toRead where
quickRead :: WrapRead toRead
mkReadsPrec :: WrapRead toRead -> Int -> ReadS toRead
mkReadsPrec (WrapRead convFn) prec str =
let
parses = readsPrec prec str
in
map
(\ (result,rest) -> (convFn result,rest))
parses
qRead :: QuickRead toRead => Int -> String -> [(toRead, String)]
qRead = mkReadsPrec quickRead
{- Example instance
instance Read ExampleType where
readsPrec = qRead
-}
data WrapShow toShow = forall show . Show show => WrapShow (toShow -> show)
class QuickShow toShow where
quickShow :: WrapShow toShow
mkShowsPrec :: WrapShow toShow -> Int -> toShow -> ShowS
mkShowsPrec (WrapShow convFn) prec value acc =
showsPrec prec (convFn value) acc
qShow :: QuickShow toShow => Int -> toShow -> String -> String
qShow = mkShowsPrec quickShow
{- Example instance
instance Show ExampleType where
showsPrec = qShow
-}