forked from github/purescript-typeable
51 lines
1.9 KiB
Haskell
51 lines
1.9 KiB
Haskell
module Test.Main where
|
|
|
|
import Prelude
|
|
|
|
import Data.Either (Either)
|
|
import Data.Typeable (class Tag0, class Tag1, class Tag3, TypeRep, eqTypeRep, proxy0, proxy1, proxy3, typeRep, typeRepFromVal)
|
|
import Effect (Effect)
|
|
|
|
foreign import clog :: forall a. a -> Effect Unit
|
|
|
|
main :: Effect Unit
|
|
main = do
|
|
clog (typeRep :: _ {name::String, age::Int})
|
|
clog (eqTypeRep typeRecord (typeRep :: _ {name::String, age::Int}))
|
|
clog (eqTypeRep (typeRep :: _ Person) typePerson)
|
|
clog (eqTypeRep (typeRep :: _ (Array Person)) typeArrPerson)
|
|
clog (eqTypeRep (typeRep :: _ (Array Person2)) typeArrPerson)
|
|
clog (eqTypeRep (typeRep :: _ (Optional Int)) (typeRepFromVal (Some 1)))
|
|
clog (eqTypeRep (typeRep :: _ (Optional Person)) (typeRepFromVal (Some 1)))
|
|
clog (eqTypeRep (typeRep :: _ (Either Int Person)) (typeRep :: _ (Either Int Person)))
|
|
clog (typeRep :: _ (Int -> Either (Either Int Int) (Optional (Array (Person)))))
|
|
clog (typeRep :: _ (Either (Either Int Int) (Optional (Array (Person)))))
|
|
clog (typeRep :: _ (Either Int Int))
|
|
clog (typeRep :: _ Int)
|
|
clog (typeRep :: _ (Foo Int Int Int))
|
|
where
|
|
typeRecord :: TypeRep {age::Int, name::String}
|
|
typeRecord = typeRep
|
|
typeArrPerson :: TypeRep (Array Person)
|
|
typeArrPerson = typeRep
|
|
typePerson :: TypeRep Person
|
|
typePerson = typeRep
|
|
-- The following should not compile since Break does not have a typeable instance
|
|
-- typeRecordBreak :: TypeRep {break::Break, name::String}
|
|
-- typeRecordBreak = typeRep
|
|
|
|
-- A data type without a typeable instance
|
|
data Break
|
|
|
|
data Foo a b c = Foo
|
|
instance tag3Foo :: Tag3 Foo where tag3 = proxy3
|
|
|
|
newtype Person = Person { name :: String, location :: String }
|
|
instance tag0Person :: Tag0 Person where tag0 = proxy0
|
|
|
|
newtype Person2 = Person2 { name :: String, location :: String }
|
|
instance tag0Person2 :: Tag0 Person2 where tag0 = proxy0
|
|
|
|
data Optional a = None | Some a
|
|
instance tag1Optional :: Tag1 Optional where tag1 = proxy1
|