{-# OPTIONS --safe #-}
module Ledger.Conway.Types.Numeric.PositiveNat where

open import Prelude
  hiding ([_,_]; [_]; _*_)

open import Class.Show using (Show; show)

open import Agda.Builtin.FromNat
open import Data.Nat using (; NonZero; _>_)
open import Data.Refinement using (Refinement-syntax; value; _,_)
open import Data.Irrelevant

-- PosNat: Non zero natural number.
PosNat : Type
PosNat = [ x    NonZero x ]

instance
  Show-PosNat : Show PosNat
  Show-PosNat .show (n , _) = show n

fromPosNat : PosNat  
fromPosNat = value

toPosNat :   Maybe PosNat
toPosNat n with nonZero? n
... | yes p = just (n , [ p ])
... | no ¬p = nothing

mkPosNat :  (n : )  {T (does (nonZero? n))}  PosNat
mkPosNat n {evidence}
  with nonZero? n in eq
... | no  _ = ⊥-elim evidence
... | yes p = n , [ p ]

PosNat-IsNonZero : (n : PosNat)  NonZero (fromPosNat n)
PosNat-IsNonZero (suc n , n>0) .NonZero.nonZero = tt

PosNat-Is>0 : (n : PosNat)  fromPosNat n > 0
PosNat-Is>0 (suc n , n>0) = s≤s z≤n

Number-PosNat : Number PosNat
Number-PosNat = record
  { Constraint = NonZero
  ; fromNat = λ n  p   n , [ p ]
  }