module Printf where
open import Level using (0ℓ)
open import StateOfTheArt
using ( Σ; _,_
; _≡_; refl
)
open import N-ary
open import Function
open import Data.List.Base using (List; []; _∷_)
open import Data.Nat.Base using (ℕ; zero; suc)
open import Data.String using (String; concat)
open import Data.Nat.Show
data Chunk : Set where
Nat : Chunk
Raw : String → Chunk
Format : Set
Format = List Chunk
size : Format → ℕ
size [] = zero
size (Nat ∷ f) = suc (size f)
size (Raw _ ∷ f) = size f
0ℓs : ∀ {n} → Levels n
0ℓs {zero} = _
0ℓs {suc n} = 0ℓ , 0ℓs
format : (fmt : Format) → Sets (size fmt) 0ℓs
format [] = _
format (Nat ∷ f) = ℕ , format f
format (Raw _ ∷ f) = format f
assemble : ∀ fmt → Product _ (format fmt) → List String
assemble [] vs = []
assemble (Nat ∷ fmt) (n , vs) = show n ∷ assemble fmt vs
assemble (Raw s ∷ fmt) vs = s ∷ assemble fmt vs
printf : ∀ fmt → Arrows _ (format fmt) String
printf fmt = curryₙ (size fmt) (concat ∘ assemble fmt)
lessThan : ℕ → ℕ → String
lessThan = printf (Nat ∷ Raw " < " ∷ Nat ∷ [])
_ : lessThan 2 5 ≡ "2 < 5"
_ = refl