{-# OPTIONS --type-in-type
    #-}

open import NeilPrelude

module CompletePartialOrder {A : Set}

                    (_≤_ : A  A  Set)

                    (_⊔_ : A  A  A)

                    ( : A)

                    (reflex   : {a : A}  a  a)
                    (antisym  : {a b : A}  a  b  b  a  a  b)
                    (transit  : {a b c : A}  a  b  b  c  a  c)

                    (supL     : {a b : A}  a  (a  b))
                    (supR     : {a b : A}  a  (b  a))

                    (leastSup : {x a b : A}  a  x  b  x  (a  b)  x)

                    (bottom   : {a : A}    a)

where

import DirectedCompletePartialOrder
open DirectedCompletePartialOrder _≤_ _⊔_ reflex antisym transit supL supR leastSup public

unitL : {a : A}    a  a
unitL = antisym (leastSup bottom reflex) supR

import CommMonoid
open CommMonoid _⊔_ associative commutative  unitL public

≤bot : {a : A}  a    a  
≤bot p = antisym p bottom

botSplit : {a b : A}  (a  b)    (a  ) × (b  )
botSplit = (≤bot  ≤bot)  leastSupR  ≡implies≤