Advertisement
Guest User

Untitled

a guest
Dec 13th, 2019
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. -- Author: Mukesh Tiwari
  2. -- https://github.com/mukeshtiwari/Idris/blob/master/Printf.idr
  3.  
  4.  
  5. import Data.String
  6.  
  7. %default total
  8.  
  9.  
  10. data Format = FInt Nat Format
  11.             | FString Format
  12.             | FOther Char Format
  13.             | FEnd
  14.  
  15.  
  16. charToNat : Char -> Nat
  17. charToNat '0' = 0  
  18. charToNat '1' = 1
  19. charToNat '2' = 2  
  20. charToNat '3' = 3  
  21. charToNat '4' = 4  
  22. charToNat '5' = 5
  23. charToNat '6' = 6  
  24. charToNat '7' = 7  
  25. charToNat '8' = 8  
  26. charToNat '9' = 9
  27. charToNat _ = 0  
  28.  
  29.  
  30. toNat' : List Char -> Nat -> Nat -> Nat
  31. toNat' (c :: cs) dnum acc = toNat' cs (dnum * 10) (acc + dnum * (charToNat c))
  32. toNat' [] dnum acc = acc
  33.            
  34. toNat : String -> Nat
  35. toNat str = toNat' (unpack (reverse str)) 1 0
  36.  
  37. joinToString' : List Char -> String -> String
  38. joinToString' (c :: cs) acc = joinToString' cs (acc ++ show c)
  39. joinToString' [] acc = acc
  40.  
  41. joinToString : List Char -> String
  42. joinToString cs = joinToString' cs ""
  43.  
  44.  
  45. generateZeros' : Nat -> String -> String
  46. generateZeros' (S n) acc = "0" ++ (generateZeros' n acc)
  47. generateZeros' Z acc = acc
  48.  
  49. generateZeros : Nat -> String
  50. generateZeros n = generateZeros' n ""
  51.  
  52. getNumber : List Char -> String -> ((List Char), Nat)
  53. getNumber (c :: cs) acc = if (isDigit c) then (getNumber cs (acc ++ show c)) else (cs, Main.toNat acc)
  54.  
  55. format : List Char -> Format
  56. format ('%' :: 'd' :: cs ) = FInt 0 ( format cs )
  57. format ('%' :: 's' :: cs ) = FString ( format cs )
  58. -- format ('%' :: '0' :: nums) =
  59. --     let tmp = getNumber nums "" in
  60. --     let cs = fst tmp in
  61. --     let count = snd tmp in
  62. --         FInt count (format cs)
  63. format ('%' :: '0' :: '0' :: 'd' :: cs) = FInt 0 (format cs)
  64. format ('%' :: '0' :: '1' :: 'd' :: cs) = FInt 1 (format cs)
  65. format ('%' :: '0' :: '2' :: 'd' :: cs) = FInt 2 (format cs)
  66. format ('%' :: '0' :: '3' :: 'd' :: cs) = FInt 3 (format cs)
  67. format ('%' :: '0' :: '4' :: 'd' :: cs) = FInt 4 (format cs)
  68. format ('%' :: '0' :: '5' :: 'd' :: cs) = FInt 5 (format cs)
  69. format ('%' :: '0' :: '6' :: 'd' :: cs) = FInt 6 (format cs)
  70. format ('%' :: '0' :: '7' :: 'd' :: cs) = FInt 7 (format cs)
  71. format ('%' :: '0' :: '8' :: 'd' :: cs) = FInt 8 (format cs)
  72. format ('%' :: '0' :: '9' :: 'd' :: cs) = FInt 9 (format cs)
  73.  
  74.  
  75. format ( c :: cs )         = FOther c ( format cs )
  76. format []                  = FEnd
  77.  
  78. interpFormat : Format -> Type
  79. interpFormat ( FInt _ f )     = Int -> interpFormat f
  80. interpFormat ( FString f )  = String -> interpFormat f
  81. interpFormat ( FOther _ f ) = interpFormat f
  82. interpFormat FEnd           = String
  83.  
  84.  
  85. formatString : String -> Format
  86. formatString s = format ( unpack s )
  87.  
  88. toFunction : ( fmt : Format ) -> String -> interpFormat fmt
  89. toFunction ( FInt count format ) acc = \i => toFunction format (acc ++ (generateZeros count) ++ show i)
  90. toFunction ( FString f ) a  = \s => toFunction f ( a ++ s )
  91. toFunction ( FOther c f ) a = toFunction f ( a ++ singleton c )
  92. toFunction FEnd a           = a
  93.  
  94.  
  95. sprintf : ( s : String ) -> interpFormat ( formatString s )
  96. sprintf s = toFunction ( formatString s ) ""
  97.  
  98. main : IO ()
  99. main = putStrLn (sprintf "String parameter: %s, integer parameter: %05d" "alpha" (10+23))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement