ref: 7ecf112fbeeb1e5814fbad231ba8159f22052d19
parent: 6704af8340fce8de731bcd712936e6f24bd41827
author: Lennart Augustsson <lennart@augustsson.net>
date: Thu Dec 21 14:49:54 EST 2023
Add Data.Dynamic
--- a/lib/AllOfLib.hs
+++ b/lib/AllOfLib.hs
@@ -18,6 +18,7 @@
import Data.Complex
import Data.Constraint
import Data.Double
+import Data.Dynamic
import Data.Either
import Data.Enum
import Data.Eq
@@ -51,6 +52,7 @@
import Data.Semigroup
import Data.STRef
import Data.Tuple
+import Data.Typeable
import Data.TypeLits
import Data.Void
import Data.Word
--- /dev/null
+++ b/lib/Data/Dynamic.hs
@@ -1,0 +1,30 @@
+module Data.Dynamic(
+ Typeable(..),
+ Dynamic,
+ toDyn,
+ fromDyn, fromDynamic,
+ dynApply, dynApp,
+ ) where
+import Prelude
+import Data.Proxy
+import Data.Typeable
+import Unsafe.Coerce
+
+data Dynamic = D TypeRep Any
+
+toDyn :: forall a . Typeable a => a -> Dynamic
+toDyn a = D (typeOf a) (unsafeCoerce a)
+
+fromDyn :: forall a . Typeable a => Dynamic -> a -> a
+fromDyn d a = fromMaybe a $ fromDynamic d
+
+fromDynamic :: forall a . Typeable a => Dynamic -> Maybe a
+fromDynamic (D tr a) | tr == typeRep (Proxy :: Proxy a) = Just (unsafeCoerce a)
+ | otherwise = Nothing
+
+dynApp :: Dynamic -> Dynamic -> Dynamic
+dynApp f a = fromMaybe (error "Dynamic.dynApp") $ dynApply f a
+
+dynApply :: Dynamic -> Dynamic -> Maybe Dynamic
+dynApply (D ftr f) (D atr a) = fmap f $ funResultTy ftr atr
+ where f rtr = D rtr ((unsafeCoerce f) a)
--
⑨