module Algebra.Lattice.Levitated (
Levitated(..)
) where
import Algebra.Lattice
data Levitated a = Top
| Levitate a
| Bottom
instance JoinSemiLattice a => JoinSemiLattice (Levitated a) where
Top `join` _ = Top
_ `join` Top = Top
Levitate x `join` Levitate y = Levitate (x `join` y)
Bottom `join` lev_y = lev_y
lev_x `join` Bottom = lev_x
instance MeetSemiLattice a => MeetSemiLattice (Levitated a) where
Top `meet` lev_y = lev_y
lev_x `meet` Top = lev_x
Levitate x `meet` Levitate y = Levitate (x `meet` y)
Bottom `meet` _ = Bottom
_ `meet` Bottom = Bottom
instance Lattice a => Lattice (Levitated a) where
instance JoinSemiLattice a => BoundedJoinSemiLattice (Levitated a) where
bottom = Bottom
instance MeetSemiLattice a => BoundedMeetSemiLattice (Levitated a) where
top = Top
instance BoundedLattice a => BoundedLattice (Levitated a) where