{-# 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 :: String -> [PrintfArgT] -> t
printfa String
format = PrintfTypeT -> t
PrintfTypeT -> forall r. PrintfType r => r
unT (PrintfTypeT -> t)
-> ([PrintfArgT] -> PrintfTypeT) -> [PrintfArgT] -> t
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (PrintfTypeT -> PrintfArgT -> PrintfTypeT)
-> PrintfTypeT -> [PrintfArgT] -> PrintfTypeT
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 r. PrintfType r => r) -> PrintfTypeT)
-> (forall r. PrintfType r => r) -> PrintfTypeT
forall a b. (a -> b) -> a -> b
$ a -> r
forall r. PrintfType r => r
r a
a ) ((forall r. PrintfType r => r) -> PrintfTypeT
T ((forall r. PrintfType r => r) -> PrintfTypeT)
-> (forall r. PrintfType r => r) -> PrintfTypeT
forall a b. (a -> b) -> a -> b
$ String -> r
forall r. PrintfType r => String -> r
printf String
format)