newRoot :: IO (Root k)
newRoot = do
  occRef <- newIORef DMap.empty
  subscribedRef <- newIORef DMap.empty
  return $ Root
    { rootOccurrence = occRef
    , rootSubscribed = subscribedRef
    , rootInit = \_ _ -> return $ return ()
    }
newRoot :: IO (Root k)
newRoot = do
  occRef <- newIORef DMap.empty
  subscribedRef <- newIORef DMap.empty
  return $ Root
    { rootOccurrence = occRef
    , rootSubscribed = subscribedRef
    , rootInit = \_ _ -> return $ return ()
    }
newRoot = do
  occRef <- newIORef DMap.empty
  subscribedRef <- newIORef DMap.empty
  return $ Root
    { rootOccurrence = occRef
    , rootSubscribed = subscribedRef
    , rootInit = \_ _ -> return $ return ()
    }