deleteM :: (Ord a) => a -> Maybe (Set a) -> Maybe (Set a)

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

deleteM :: (Ord a) => a -> Maybe (Set a) -> Maybe (Set a)

Martin Hofmann-4
I often come across the problem to insert into a collection which might
not exist yet, or delete from it and want the collection to be deleted
if it is empty afterwards.

I always end up with these two functions:


deleteM :: (Ord a) => a -> Maybe (Set a) -> Maybe (Set a)
deleteM e s =
    liftM (S.delete e) s >>=  \s' ->
        if S.null s' then return s' else Nothing

insertM :: (Ord a) => a -> Maybe (Set a) -> Maybe (Set a)
insertM  e s   =
    case s of
        (Just s') -> return $ S.insert e s'
        Nothing   -> return $ S.insert S.empty

Is there a way to express each in a (polymorphic) point-free one-liner?
If not, why isn't there such a function for the standard collection,
because IMHO this is what you need when using 'alter'.

Thanks,

Martin

Reply | Threaded
Open this post in threaded view
|

Re: deleteM :: (Ord a) => a -> Maybe (Set a) -> Maybe (Set a)

Heinrich Apfelmus
Martin Hofmann wrote:

> I often come across the problem to insert into a collection which might
> not exist yet, or delete from it and want the collection to be deleted
> if it is empty afterwards.
>
> I always end up with these two functions:
>
>
> deleteM :: (Ord a) => a -> Maybe (Set a) -> Maybe (Set a)
> deleteM e s =
>     liftM (S.delete e) s >>=  \s' ->
>         if S.null s' then return s' else Nothing
>
> insertM :: (Ord a) => a -> Maybe (Set a) -> Maybe (Set a)
> insertM  e s   =
>     case s of
>         (Just s') -> return $ S.insert e s'
>         Nothing   -> return $ S.insert S.empty
>
> Is there a way to express each in a (polymorphic) point-free one-liner?
> If not, why isn't there such a function for the standard collection,
> because IMHO this is what you need when using 'alter'.

Yes, there is a way. :)

  deleteM e = (\s -> if S.null s then Just s else Nothing) . S.delete e
  insertM e = Just . S.insert e . maybe S.empty id

The  maybe  function is from  Data.Maybe .

I did wonder why you want to delete the empty set, but now I see that
you need it for  alter  .


Regards,
apfelmus

--
http://apfelmus.nfshost.com