In a perfect world we would use something like Foldable1 from semigroupoids, but sadly that is not in base.
However, this is exactly why I proposed the Intersection newtype, as it would make it nice and easy to use with a Foldable1
like type class.

On Sun, Dec 6, 2020 at 10:27 AM Alexandre Rodrigues Baldé <alexandreR_B@outlook.com> wrote:

Sounds like a good idea, could it be possible to use a typeclass instead of `NonEmpty (Set a)`?

I recall needing this a few times, but not over a NonEmpty.

 

De: Libraries <libraries-bounces@haskell.org> em nome de Reed Mullanix <reedmullanix@gmail.com>
Enviado: Sunday, December 6, 2020 6:20:02 AM
Para: Haskell Libraries <libraries@haskell.org>
Assunto: containers: intersections for Set, along with Semigroup newtype

 

Hey all,

I've found myself reaching for the following function a couple of times now, so I figured it might make a good addition.

 

  intersections :: Ord a => NonEmpty (Set a) -> Set a
  intersections (s :| ss) = Foldable.foldl' intersection s ss

 

In a similar vein, we may as well add the following newtype + instance combo:

 

  newtype Intersection a = Intersection { getIntersection :: Set a }

 

  instance (Ord a) => Semigroup (Intersection a) where
      (Intersection a) <> (Intersection b) = Intersection $ intersection a b
      stimes = stimesIdempotent

 

Would love to hear everyone's thoughts on this!

Thanks

Reed Mullanix