diff options
Diffstat (limited to 'src/Xanthous/Entities/SomeEntity.hs')
-rw-r--r-- | src/Xanthous/Entities/SomeEntity.hs | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/src/Xanthous/Entities/SomeEntity.hs b/src/Xanthous/Entities/SomeEntity.hs new file mode 100644 index 000000000000..029247de9b7f --- /dev/null +++ b/src/Xanthous/Entities/SomeEntity.hs @@ -0,0 +1,34 @@ +{-# LANGUAGE GADTs #-} +module Xanthous.Entities.SomeEntity + ( SomeEntity(..) + , downcastEntity + ) where + +import Xanthous.Prelude +import Test.QuickCheck (Arbitrary(..)) +import qualified Test.QuickCheck.Gen as Gen + +import Xanthous.Entities (Draw(..), Entity) +import Data.Typeable +import Xanthous.Entities.Character + +data SomeEntity where + SomeEntity :: forall a. (Entity a, Typeable a) => a -> SomeEntity + +instance Show SomeEntity where + show (SomeEntity x) = "SomeEntity (" <> show x <> ")" + +instance Eq SomeEntity where + (SomeEntity (a :: ea)) == (SomeEntity (b :: eb)) = case eqT @ea @eb of + Just Refl -> a == b + _ -> False + +instance Arbitrary SomeEntity where + arbitrary = Gen.oneof + [pure $ SomeEntity Character] + +instance Draw SomeEntity where + draw (SomeEntity ent) = draw ent + +downcastEntity :: (Entity a, Typeable a) => SomeEntity -> Maybe a +downcastEntity (SomeEntity e) = cast e |