{-# LANGUAGE ExistentialQuantification #-}
{-# LANGUAGE RankNTypes #-}
module Text.PrintfA
where

import Text.Printf

data PrintfArgT = forall a. PrintfArg a => P a
data PrintfTypeT = T { PrintfTypeT -> forall r. PrintfType r => r
unT :: forall r. PrintfType r => r }

printfa :: PrintfType t => String -> [ PrintfArgT ] -> t
printfa :: forall t. PrintfType t => String -> [PrintfArgT] -> t
printfa String
format = (\(T forall r. PrintfType r => r
t) -> forall r. PrintfType r => r
t) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl (\(T forall r. PrintfType r => r
r) (P a
a) -> (forall r. PrintfType r => r) -> PrintfTypeT
T forall a b. (a -> b) -> a -> b
$ forall r. PrintfType r => r
r a
a ) ((forall r. PrintfType r => r) -> PrintfTypeT
T forall a b. (a -> b) -> a -> b
$ forall r. PrintfType r => String -> r
printf String
format)