shithub: MicroHs

Download patch

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)
--