{-# LANGUAGE ExistentialQuantification #-}
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
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