@@ -22,6 +22,7 @@ import qualified Data.IntMap as IntMap
2222import Control.Monad.Ref
2323import Control.Monad.Exception
2424import Data.Monoid ((<>))
25+import Data.Coerce
2526
2627import System.IO.Unsafe
2728import Unsafe.Coerce
@@ -733,7 +734,7 @@ readBehaviorTracked b = case b of
733734
734735readEvent :: Event a -> ResultM (Maybe a)
735736readEvent e = case e of
736− EventRoot k r -> liftIO . liftM (fmap runIdentity . DMap.lookup k) . readIORef $ rootOccurrence r
737+ EventRoot k r -> liftIO . liftM (coerce . DMap.lookup k) . readIORef $ rootOccurrence r
737738 EventNever -> return Nothing
738739 EventPush p -> do
739740 subscribed <- getPushSubscribed p
@@ -749,7 +750,7 @@ readEvent e = case e of
749750 return result
750751 EventFan k f -> do
751752 parentOcc <- readEvent $ fanParent f
752− return . fmap runIdentity $ DMap.lookup k =<< parentOcc
753+ return . coerce $ DMap.lookup k =<< parentOcc
753754 EventSwitch s -> do
754755 subscribed <- getSwitchSubscribed s
755756 liftIO $ do
@@ -814,7 +815,7 @@ getEventSubscribedOcc es = case es of
814815 EventSubscribedPush subscribed -> readIORef $ pushSubscribedOccurrence subscribed
815816 EventSubscribedFan k subscribed -> do
816817 parentOcc <- getEventSubscribedOcc $ fanSubscribedParent subscribed
817− let occ = fmap runIdentity $ DMap.lookup k =<< parentOcc
818+ let occ = coerce $ DMap.lookup k =<< parentOcc
818819 return occ
819820 EventSubscribedMerge subscribed -> readIORef $ mergeSubscribedOccurrence subscribed
820821 EventSubscribedSwitch subscribed -> readIORef $ switchSubscribedOccurrence subscribed
@@ -847,7 +848,7 @@ getRootSubscribed k r = do
847848 Just subscribed -> return subscribed
848849 Nothing -> liftIO $ do
849850 subscribersRef <- newIORef []
850− subscribed <- newRootSubscribed (liftM (fmap runIdentity . DMap.lookup k) $ readIORef $ rootOccurrence r) subscribersRef
851+ subscribed <- newRootSubscribed (liftM (coerce . DMap.lookup k) $ readIORef $ rootOccurrence r) subscribersRef
851852 -- Strangely, init needs the same stuff as a RootSubscribed has, but it must not be the same as the one that everyone's subscribing to, or it'll leak memory
852853 uninit <- rootInit r k $ RootTrigger (subscribersRef, rootOccurrence r, k)
853854 addFinalizer subscribed $ do
@@ -900,7 +901,7 @@ getMergeSubscribed m = {-# SCC "getMergeSubscribed.entire" #-} do
900901 parentSubd <- {-# SCC "getMergeSubscribed.a.parentSubd" #-} subscribe e $ WeakSubscriberMerge k ws
901902 parentOcc <- {-# SCC "getMergeSubscribed.a.parentOcc" #-} liftIO $ getEventSubscribedOcc parentSubd
902903 height <- {-# SCC "getMergeSubscribed.a.height" #-} liftIO $ readIORef $ eventSubscribedHeightRef parentSubd
903− return $ {-# SCC "getMergeSubscribed.a.returnVal" #-} (unsafeCoerce s :: Any, fmap ((k :=>) . Identity) parentOcc, height, k :=> parentSubd)
904+ return $ {-# SCC "getMergeSubscribed.a.returnVal" #-} (unsafeCoerce s :: Any, fmap (\x -> k :=> Identity x) parentOcc, height, k :=> parentSubd)
904905 let dm = DMap.fromDistinctAscList $ catMaybes $ map (\(_, x, _, _) -> x) subscribers
905906 subscriberHeights = map (\(_, _, x, _) -> x) subscribers
906907 myHeight =