open import Agda.Primitive using (Level)
open import Agda.Builtin.Nat using (suc; _+_) renaming (Nat to ℕ)

private variable
  ℓ : Level
  A : Set ℓ

data Wrap {ℓ} (A : Set ℓ) : Set ℓ where
  mk : A → Wrap A

unmk : Wrap A → A
unmk (mk a) = a

record Point : Set where
  field slot      : Wrap ℕ
        blockHash : ℕ
open Point public

matchPoint : Point → ℕ
matchPoint record {slot = mk n} = n

exPoint : Point
exPoint .slot      = mk 42
exPoint .blockHash = 0

Hash = ℕ

record Header : Set where
  field  slotNo blockNo : ℕ
         blockHash      : Hash
         prev nodeId    : ℕ
open Header public

matchHeader : Header → ℕ
matchHeader record {slotNo = n} = n

exHeader : Header
exHeader = λ where
  .slotNo → 42
  .blockNo → 0
  .blockHash → 0
  .prev → 0
  .nodeId → 0

data Tx : Set where
  inc dec : Tx

pred : ℕ → ℕ
pred 0 = 0
pred (suc n) = n

open import Agda.Builtin.Nat

test : Nat
test = unmk (exPoint .slot)
     + matchPoint exPoint
     + slotNo (record
                 { slotNo = 42
                 ; blockNo = 0
                 ; blockHash = 0
                 ; prev = 0
                 ; nodeId = 0
                 })
     + matchHeader exHeader
{-# COMPILE AGDA2LAMBOX test #-}
Debug λ☐ Rocq
  ↪  
WASM C OCaml CakeML Rust Elm
  ↪  
  ↪