-
Notifications
You must be signed in to change notification settings - Fork 14
Add nondeterminstic map delete and insertIfAbsent #124
Description
The Data.LVar.SLMap.insert function throws the runtime error "Multiple puts to one entry in an IMap!" if a 2nd insertion for the same key is attempted.
-- | Put a single entry into the map. (WHNF) Strict in the key and value.
insert :: (Ord k, Eq v, HasPut e) =>
k -> v -> IMap k s v -> Par e s ()
insert !key !elm (IMap (WrapLVar lv)) = WrapPar$ putLV lv putter
where putter slm = do
putRes <- SLM.putIfAbsent slm key $ return elm
case putRes of
Added _ -> return $ Just (key, elm)
Found _ -> throw$ ConflictingPutExn$ "Multiple puts to one entry in an IMap!"Is there a fundamental objection to an additional insertIfAbsent in SLMap with different semantics, namely that the 1st value written to a key entry succeeds, subsequent attempts to the same key are silently ignored? With the same type, i.e.
insertIfAbsent :: (Ord k, Eq v, HasPut e) => k -> v -> IMap k s v -> Par e s ()This is the implementation of the underlying putIfAbsent_ used by putIfAbsent:
putIfAbsent_ (Bottom m) shortcut k vc0 _coin install = retryLoop vc0 where
-- The retry loop; ensures that vc is only executed once
retryLoop vc = do
searchResult <- liftIO $ LM.find (fromMaybe m shortcut) k
case searchResult of
LM.Found v -> return $ Found v
LM.NotFound tok -> do
v <- vc
maybeMap <- liftIO $ LM.tryInsert tok v
case maybeMap of
Just m' -> do
install m' v -- all set on the bottom level, now try indices
return $ Added v
Nothing -> retryLoop $ return v -- next time around, remember the value to insertIt looks like the putIfAbsent in the skip list map module simply ignores subsequent write attempts to a key entry, returning Found v if a value already exists. Could this be lifted into the SLMap API as an alternative insertion function insertIfAbsent in the way I describe?
Not sure who subscribes to GitHub issues for the lvars repo, cc @osa1 @rrnewton .