39 lines
1.1 KiB
Agda
39 lines
1.1 KiB
Agda
module Showable where
|
||
|
||
open import Data.String using (String; _++_)
|
||
open import Data.Nat using (ℕ)
|
||
open import Data.Nat.Show using () renaming (show to showNat)
|
||
open import Data.Fin using (Fin)
|
||
open import Data.Fin.Show using () renaming (show to showFin)
|
||
open import Data.Product using (_×_; _,_)
|
||
open import Data.Unit using (⊤; tt)
|
||
|
||
record Showable {a} (A : Set a) : Set a where
|
||
field
|
||
show : A → String
|
||
|
||
open Showable {{ ... }} public
|
||
|
||
instance
|
||
showableString : Showable String
|
||
showableString = record { show = λ s → "\"" ++ s ++ "\"" }
|
||
|
||
showableNat : Showable ℕ
|
||
showableNat = record { show = showNat }
|
||
|
||
showableFin : ∀ {n : ℕ} → Showable (Fin n)
|
||
showableFin = record { show = showFin }
|
||
|
||
showableProd : ∀ {a b} {A : Set a} {B : Set b}
|
||
{{ showableA : Showable A }} {{ showableB : Showable B }} →
|
||
Showable (A × B)
|
||
showableProd {{ showableA }} {{ showableB }} = record
|
||
{ show = λ (a , b) →
|
||
"(" ++ show a ++
|
||
", " ++ show b ++
|
||
")"
|
||
}
|
||
|
||
showableUnit : Showable ⊤
|
||
showableUnit = record { show = λ tt → "()" }
|