{-# OPTIONS --safe #-}
module Ledger.Core.Specification.ProtocolVersion where

open import Ledger.Prelude

private
  variable
    m n : 


ProtVer : Type
ProtVer =  × 

pvMajor : ProtVer  
pvMajor = proj₁

pvMinor : ProtVer  
pvMinor = proj₂


data pvCanFollowMajor : ProtVer  ProtVer  Type where
  canFollowMajor : pvCanFollowMajor (m + 1 , 0) (m , n)

data pvCanFollowMinor : ProtVer  ProtVer  Type where
  canFollowMinor : pvCanFollowMinor (m , n + 1) (m , n)

pvCanFollow : ProtVer  ProtVer  Type
pvCanFollow v₁ v₂ = pvCanFollowMajor v₁ v₂  pvCanFollowMinor v₁ v₂


instance
  Show-ProtVer : Show ProtVer
  Show-ProtVer = Show-×

  Dec-pvCanFollowMajor :  {pv} {pv'}  Dec (pvCanFollowMajor pv pv')
  Dec-pvCanFollowMajor {pv} {m , n} with pv  (m + 1 , 0)
  ... | yes refl = yes canFollowMajor
  ... | no ¬p = no  { canFollowMajor  ¬p refl })

  Dec-pvCanFollowMinor :  {pv} {pv'}  Dec (pvCanFollowMinor pv pv')
  Dec-pvCanFollowMinor {pv} {m , n} with pv  (m , n + 1)
  ... | yes refl = yes canFollowMinor
  ... | no ¬p = no  { canFollowMinor  ¬p refl })

  pvCanFollowMajor? : pvCanFollowMajor ⁇²
  pvCanFollowMajor? =  Dec-pvCanFollowMajor

  pvCanFollowMinor? : pvCanFollowMinor ⁇²
  pvCanFollowMinor? =  Dec-pvCanFollowMinor

pvCanFollow? :  {pv} {pv'}  Dec (pvCanFollow pv pv')
pvCanFollow? = Dec-pvCanFollowMajor ⊎-dec Dec-pvCanFollowMinor