indexation-0.2: library/Indexation/Potoki/Transform.hs
module Indexation.Potoki.Transform where
import Indexation.Prelude hiding (runState)
import Indexation.Types
import Potoki.Core.Transform
import qualified Focus
import qualified STMContainers.Map as StmMap
indexConcurrently :: (Eq entity, Hashable entity) => Indexer entity -> Transform entity (Index entity)
indexConcurrently (Indexer sizeVar map) =
mapInIO $ \ entity -> atomically $ StmMap.focus strategy entity map
where
strategy = \ case
Just indexInt -> return (Index indexInt, Focus.Keep)
Nothing -> do
size <- readTVar sizeVar
writeTVar sizeVar $! succ size
return (Index size, Focus.Replace size)