linear-base icon indicating copy to clipboard operation
linear-base copied to clipboard

Address an elemet from a list from Data.List.Linear

Open hellwolf opened this issue 6 months ago • 1 comments

Is your feature request related to a problem? Please describe.

Data.List.Linear doesn't seem to provide a simple function akin to (!!) for the non-linear List. What would be the recommended way of doing it?

Describe the solution you'd like

This is a prototypical linearListElemAtM and linearListElemAt that allow one to address the element by providing a (monadic in the M-variant) function that duplicates the element.

linearListElemAtM :: forall a m.
  Control.Functor.Linear.Monad m =>
  (a ⊸ m (a, a)) -> [a] ⊸ Int -> m (Maybe a, [a])
linearListElemAtM dupM xs idx =
  let !(ys, zzs) = L.splitAt idx xs
  in case L.uncons zzs of
        Just (a, zs) -> dupM a Control.Functor.Linear.>>= \(a1, a2) ->
          Control.Functor.Linear.pure (Just a1, ys L.++ a2 : zs)
        Nothing      -> Control.Functor.Linear.pure (Nothing, ys)

linearListElemAt :: forall a.
  (a ⊸ (a, a)) -> [a] ⊸ Int -> (Maybe a, [a])
linearListElemAt dupF xs idx = L.runIdentity (linearListElemAtM (\x -> L.Identity (dupF x)) xs idx)

Describe alternatives you've considered

I have not found what's the "recommended" way for doing it.

Additional context

This prototype does assume Dupable instance for a, for Dupable instance a specialized function may be provide, instead.

hellwolf avatar Apr 11 '25 13:04 hellwolf