mirror of
https://github.com/idris-lang/Idris2.git
synced 2024-12-29 22:51:51 +03:00
39 lines
1.3 KiB
Idris
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"
|