{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE DefaultSignatures #-}
module RON.Semilattice (
Semilattice (..),
BoundedSemilattice,
) where
import Prelude
import Data.Semigroup (Max)
import Data.Set (Set)
class Semigroup a => Semilattice a where
(≼) :: a -> a -> Bool
default (≼) :: Eq a => a -> a -> Bool
a
a ≼ a
b = a
a a -> a -> a
forall a. Semigroup a => a -> a -> a
<> a
b a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== a
b
type BoundedSemilattice a = (Monoid a, Semilattice a)
instance Ord a => Semilattice (Max a)
instance Ord a => Semilattice (Set a)
instance Semilattice a => Semilattice (Maybe a) where
Maybe a
Nothing ≼ :: Maybe a -> Maybe a -> Bool
≼ Maybe a
_ = Bool
True
Maybe a
_ ≼ Maybe a
Nothing = Bool
False
Just a
a ≼ Just a
b = a
a a -> a -> Bool
forall a. Semilattice a => a -> a -> Bool
≼ a
b