module Data.Semilattice ( Semilattice , merge ) where import Data.Semigroup (Max, Semigroup, (<>)) import Data.Set (Set) {- | A semilattice. It may be a join-semilattice, or meet-semilattice, it doesn't matter. If it matters for you, use package @lattices@. In addition to 'Semigroup', Semilattice defines this laws: [commutativity] @x '<>' y == y '<>' x@ [idempotency] @x '<>' x == x@ -} class Semigroup a => Semilattice a -- | Just ('Semigroup.<>'), specialized to 'Semilattice'. merge :: Semilattice a => a -> a -> a merge = (<>) infixr 6 `merge` {-# INLINE merge #-} -- instances for external types instance Ord a => Semilattice (Max a) instance Ord a => Semilattice (Set a)