{-# LANGUAGE ExistentialQuantification,
DeriveDataTypeable,
PatternSignatures #-}
import Data.Typeable
data SomeTest = forall t . Test t => SomeTest t
deriving Typeable
class (Typeable t
, Show t
) => Test t
where toTest :: t -> SomeTest
fromTest
:: SomeTest
-> Maybe t
toTest = SomeTest
fromTest (SomeTest t) = cast t
instance Test SomeTest where
toTest st = st
fromTest = Just
instance Show SomeTest
where
data Handler a = forall t . Test t => Handler (t -> a)
test
:: [Handler a
] -> SomeTest
-> Maybe a
test handlers t
= foldr tryHandler Nothing handlers
where tryHandler (Handler handler) rest
= case fromTest t of
Just t' -> Just $ handler t'
Nothing -> rest
main = do
let tests
= [toTest
(5::Int), toTest False
, toTest
'a'] let handlers
= [Handler
(\
(a
:: Int) -> "Int: " ++ show a
), Handler
(\
(a
:: Bool) -> "Bool: " ++ show a
)] putStr "Try execute handlers: "
ey0jIExBTkdVQUdFIEV4aXN0ZW50aWFsUXVhbnRpZmljYXRpb24sCiAgICAgICAgICAgICBEZXJpdmVEYXRhVHlwZWFibGUsCiAgICAgICAgICAgICBQYXR0ZXJuU2lnbmF0dXJlcyAjLX0KaW1wb3J0IERhdGEuVHlwZWFibGUKCmRhdGEgU29tZVRlc3QgPSBmb3JhbGwgdCAuIFRlc3QgdCA9PiBTb21lVGVzdCB0CiAgICBkZXJpdmluZyBUeXBlYWJsZQoKY2xhc3MgKFR5cGVhYmxlIHQsIFNob3cgdCkgPT4gVGVzdCB0IHdoZXJlCiAgICB0b1Rlc3QgOjogdCAtPiBTb21lVGVzdAogICAgZnJvbVRlc3QgOjogU29tZVRlc3QgLT4gTWF5YmUgdAogICAgdG9UZXN0ID0gU29tZVRlc3QKICAgIGZyb21UZXN0IChTb21lVGVzdCB0KSA9IGNhc3QgdAoKaW5zdGFuY2UgVGVzdCBTb21lVGVzdCB3aGVyZQogICAgdG9UZXN0IHN0ID0gc3QKICAgIGZyb21UZXN0ID0gSnVzdAoKaW5zdGFuY2UgU2hvdyBTb21lVGVzdCB3aGVyZQogICAgc2hvdyAoU29tZVRlc3QgcykgPSBzaG93IHMKCmluc3RhbmNlIFRlc3QgSW50IHdoZXJlCmluc3RhbmNlIFRlc3QgQm9vbCB3aGVyZQppbnN0YW5jZSBUZXN0IENoYXIgd2hlcmUKCmRhdGEgSGFuZGxlciBhID0gZm9yYWxsIHQgLiBUZXN0IHQgPT4gSGFuZGxlciAodCAtPiBhKQoKdGVzdCA6OiBbSGFuZGxlciBhXSAtPiBTb21lVGVzdCAtPiBNYXliZSBhCnRlc3QgaGFuZGxlcnMgdCA9IGZvbGRyIHRyeUhhbmRsZXIgTm90aGluZyBoYW5kbGVycwogICAgd2hlcmUgdHJ5SGFuZGxlciAoSGFuZGxlciBoYW5kbGVyKSByZXN0CiAgICAgICAgICAgICAgPSBjYXNlIGZyb21UZXN0IHQgb2YKICAgICAgICAgICAgICAgIEp1c3QgdCcgLT4gSnVzdCAkIGhhbmRsZXIgdCcKICAgICAgICAgICAgICAgIE5vdGhpbmcgLT4gcmVzdAoKbWFpbiA9IGRvCiAgICBsZXQgdGVzdHMgPSBbdG9UZXN0ICg1OjpJbnQpLCB0b1Rlc3QgRmFsc2UsIHRvVGVzdCAnYSddCiAgICBwdXRTdHIgIlRyeSBjYXN0IHRvIEludDogIgogICAgcHJpbnQgJCAobWFwIGZyb21UZXN0IHRlc3RzIDo6IFtNYXliZSBJbnRdKQogICAgcHV0U3RyICJUcnkgY2FzdCB0byBCb29sOiAiCiAgICBwcmludCAkIChtYXAgZnJvbVRlc3QgdGVzdHMgOjogW01heWJlIEJvb2xdKQogICAgbGV0IGhhbmRsZXJzID0gW0hhbmRsZXIgKFwgKGEgOjogSW50KSAtPiAiSW50OiAiICsrIHNob3cgYSksCiAgICAgICAgICAgICAgICAgICAgSGFuZGxlciAoXCAoYSA6OiBCb29sKSAtPiAiQm9vbDogIiArKyBzaG93IGEpXQogICAgcHV0U3RyICJUcnkgZXhlY3V0ZSBoYW5kbGVyczogIgogICAgcHJpbnQgJCAobWFwICh0ZXN0IGhhbmRsZXJzKSB0ZXN0cyk=