Skip to content

Add nondeterminstic map delete and insertIfAbsent #124

@robstewart57

Description

@robstewart57

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 insert

It 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 .

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions