module read where

open import Agda.Builtin.Unit
open import Level as L
open import Codata.IO
open import Data.Bool.Base
open import Data.Nat.Base
open import Data.String
open import Codata.Musical.Costring
open import Data.Product
open import Function

data Type : Set → Set where
  N : Type ℕ
  B : Type Bool

readSet : ∀ {ℓ} → IO (L.suc ℓ) (∃ Type)
readSet = do
  str ← getLine
  return $ if str == "Nat" then -, N else -, B

record StringOf (T : Set) : Set where
  constructor mkStringOf
  field string : String

instance
  valueℕ : StringOf ℕ
  valueℕ = mkStringOf "0"

  valueBool : StringOf Bool
  valueBool = mkStringOf "true"

it : {X : Set} → {{_ : X}} → X
it {{x}} = x

dispatch : {S : Set} → Type S → StringOf S
dispatch N = it
dispatch B = it

read : IO (L.suc L.zero) ⊤
read = do
  (s , S) ← readSet
  let str = StringOf.string (dispatch S)
  putStrLn str

main : Main
main = run read
