on 2cd9aac help sign in
patch/src/Data/FastMutableIntMap.hs
76 lines 2.2 kB history raw
1{-# LANGUAGE TypeFamilies #-}
2module Data.FastMutableIntMap
3 ( FastMutableIntMap
4 , new
5 , newEmpty
6 , insert
7 , isEmpty
8 , getFrozenAndClear
9 , size
10 , applyPatch
11 , PatchIntMap (..)
12 , traverseIntMapPatchWithKey
13 , lookup
14 , forIntersectionWithImmutable_
15 , for_
16 , patchIntMapNewElements
17 , patchIntMapNewElementsMap
18 , getDeletions
19 ) where
21--TODO: Pure JS version
22--TODO: Fast copy to FastIntMap
23--TODO: Fast patch type
25import Prelude hiding (lookup)
27import Control.Monad.IO.Class
28import Data.Foldable (traverse_)
29import Data.IntMap.Strict (IntMap)
30import qualified Data.IntMap.Strict as IntMap
31import Data.IORef
32import Reflex.Patch.Class
33import Reflex.Patch.IntMap
35newtype FastMutableIntMap a = FastMutableIntMap (IORef (IntMap a))
37new :: IntMap a -> IO (FastMutableIntMap a)
38new m = FastMutableIntMap <$> newIORef m
40newEmpty :: IO (FastMutableIntMap a)
41newEmpty = FastMutableIntMap <$> newIORef IntMap.empty
43insert :: FastMutableIntMap a -> Int -> a -> IO ()
44insert (FastMutableIntMap r) k v = modifyIORef' r $ IntMap.insert k v
46lookup :: FastMutableIntMap a -> Int -> IO (Maybe a)
47lookup (FastMutableIntMap r) k = IntMap.lookup k <$> readIORef r
49forIntersectionWithImmutable_ :: MonadIO m => FastMutableIntMap a -> IntMap b -> (a -> b -> m ()) -> m ()
50forIntersectionWithImmutable_ (FastMutableIntMap r) b f = do
51 a <- liftIO $ readIORef r
52 traverse_ (uncurry f) $ IntMap.intersectionWith (,) a b
54for_ :: MonadIO m => FastMutableIntMap a -> (a -> m ()) -> m ()
55for_ (FastMutableIntMap r) f = do
56 a <- liftIO $ readIORef r
57 traverse_ f a
59isEmpty :: FastMutableIntMap a -> IO Bool
60isEmpty (FastMutableIntMap r) = IntMap.null <$> readIORef r
62size :: FastMutableIntMap a -> IO Int
63size (FastMutableIntMap r) = IntMap.size <$> readIORef r
65-- | Make an immutable snapshot of the datastructure and clear it
66getFrozenAndClear :: FastMutableIntMap a -> IO (IntMap a)
67getFrozenAndClear (FastMutableIntMap r) = do
68 result <- readIORef r
69 writeIORef r IntMap.empty
70 return result
72applyPatch :: FastMutableIntMap a -> PatchIntMap a -> IO (IntMap a)
73applyPatch (FastMutableIntMap r) p@(PatchIntMap m) = do
74 v <- readIORef r
75 writeIORef r $! applyAlways p v
76 return $ IntMap.intersection v m