{-# LANGUAGE Safe #-}
{-# LANGUAGE ExistentialQuantification, GADTs #-}
module Copilot.Core.Type.Read
( ReadWit (..)
, readWit
, readWithType
) where
import Copilot.Core.Type
import Copilot.Core.Error (badUsage)
data ReadWit a = Read a => ReadWit
readWit :: Type a -> ReadWit a
readWit :: Type a -> ReadWit a
readWit Type a
t =
case Type a
t of
Type a
Bool -> ReadWit a
forall a. Read a => ReadWit a
ReadWit
Type a
Int8 -> ReadWit a
forall a. Read a => ReadWit a
ReadWit
Type a
Int16 -> ReadWit a
forall a. Read a => ReadWit a
ReadWit
Type a
Int32 -> ReadWit a
forall a. Read a => ReadWit a
ReadWit
Type a
Int64 -> ReadWit a
forall a. Read a => ReadWit a
ReadWit
Type a
Word8 -> ReadWit a
forall a. Read a => ReadWit a
ReadWit
Type a
Word16 -> ReadWit a
forall a. Read a => ReadWit a
ReadWit
Type a
Word32 -> ReadWit a
forall a. Read a => ReadWit a
ReadWit
Type a
Word64 -> ReadWit a
forall a. Read a => ReadWit a
ReadWit
Type a
Float -> ReadWit a
forall a. Read a => ReadWit a
ReadWit
Type a
Double -> ReadWit a
forall a. Read a => ReadWit a
ReadWit
readWithType :: Type a -> String -> a
readWithType :: Type a -> String -> a
readWithType Type a
t String
str =
case Type a
t of
Type a
Bool -> case String
str of
String
"0" -> a
Bool
False
String
"1" -> a
Bool
True
String
x -> String -> a
forall a. String -> a
badUsage (String -> a) -> String -> a
forall a b. (a -> b) -> a -> b
$ String
"in readWithType in copilot-core: expecting a \"0\" or \"1\" when reading a Boolean value " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String -> String
forall a. Show a => a -> String
show String
x String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"."
Type a
_ -> a
rd
where
rd :: a
rd = case Type a -> ReadWit a
forall a. Type a -> ReadWit a
readWit Type a
t of
ReadWit a
ReadWit -> String -> a
forall a. Read a => String -> a
read String
str