Idris2/tests/idris2/perf/perf010/Printf.idr
2023-09-07 14:57:22 +01:00

39 lines
1.3 KiB
Idris

module Printf
import Prelude
import Data.String
data Arg
= AInt Arg
| AOther Char Arg
| AEnd
buildArg : List Char -> Arg
buildArg fmt = case fmt of
'%' :: 'i' :: fmtTail => AInt (buildArg fmtTail)
c :: fmtTail => AOther c (buildArg fmtTail)
Nil => AEnd
argToType : Arg -> Type -> Type
argToType a result = case a of
AInt fmtTail => Int -> argToType fmtTail result
AOther _ fmtTail => argToType fmtTail result
AEnd => result
-- PrintfType "foo" result = result
-- PrintfType "%i\n" result = Int -> result
-- etc
PrintfType : String -> Type -> Type
PrintfType fmt result = argToType (buildArg (unpack fmt)) result
sprintf : (fmt : String) -> PrintfType fmt String
sprintf fmt = go "" (buildArg (unpack fmt)) where
go : String -> (arg : Arg) -> argToType arg String
go strTail arg = case arg of
AInt fmtTail => \i : Int => go (strTail ++ show i) fmtTail
AOther c fmtTail => go (strTail ++ singleton c) fmtTail
AEnd => strTail
test : ?result
test = sprintf "%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i"