PLFA agda exercises
------------------------------------------------------------------------
-- The Agda standard library
--
-- Closures of a unary relation with respect to a strict partial order
------------------------------------------------------------------------

{-# OPTIONS --cubical-compatible --safe #-}

open import Relation.Binary.Bundles using (StrictPartialOrder)

module Relation.Unary.Closure.StrictPartialOrder
       {a r e} (P : StrictPartialOrder a e r) where

open StrictPartialOrder P renaming (_<_ to _∼_)
open import Relation.Unary using (Pred)

-- Specialising the results proven generically in `Base`.
import Relation.Unary.Closure.Base _∼_ as Base
open Base public
  using (□; ◇; Closed; curry; uncurry)
  hiding (module □; module ◇)

module □ {t} {T : Pred Carrier t} where

  reindex : ∀ {x y} → x ∼ y → □ T x → □ T y
  reindex = Base.□.reindex trans

  duplicate : ∀ {x} → □ T x → □ (□ T) x
  duplicate = Base.□.duplicate trans

  closed : ∀ {t} {T : Pred Carrier t} → Closed (□ T)
  closed = Base.□.closed trans

  open Base.□ public using (map)

module ◇ {t} {T : Pred Carrier t} where

  reindex : ∀ {x y} → x ∼ y → ◇ T x → ◇ T y
  reindex = Base.◇.reindex trans

  join : ∀ {x} → ◇ (◇ T) x → ◇ T x
  join = Base.◇.join trans

  closed : Closed (◇ T)
  closed = Base.◇.closed trans

  open Base.◇ public using (map; run)