Augmented sequence deletion

David Feuer david.feuer at gmail.com
Sat Dec 28 19:24:58 UTC 2019


Data.Sequence offers

  deleteAt :: Int -> Seq a -> Seq a

which deletes the element at the given index. Today, I ran into a
situation where I wanted to know what was deleted.

  deleteLookup :: Int -> Seq a -> Maybe (a, Seq a)

The closest thing I can find in `containers` is in Data.Map:

  updateLookupWithKey :: Ord k => (k -> a -> Maybe a) -> k -> Map k a
-> (Maybe a,Map k a)

Unfortunately, that function is ugly and strange. A better one, whose
name I can't guess at the moment:

  flabbergast :: (a -> (b, Maybe a)) -> Int -> Seq a -> Maybe (b, Seq a)

where a Nothing result means the index was out of bounds. There's also
a potential

  flabbergastF :: Functor f => (a -> f (Maybe a)) -> Int -> Seq a ->
Maybe (f (Seq a))

I'm not sure if flabbergast can be made as fast as deleteLookup, so
it's possible we may want both. Any opinions?


More information about the Libraries mailing list