0 | module Data.Linear.LNat
2 | import Data.Linear.Bifunctor
3 | import Data.Linear.Notation
4 | import Data.Linear.Interface
10 | data LNat : Type where
17 | 0 toNat : LNat -@ Nat
19 | toNat (Succ n) = S (toNat n)
22 | Consumable LNat where
24 | consume (Succ n) = consume n
27 | Duplicable LNat where
28 | duplicate Zero = [Zero, Zero]
29 | duplicate (Succ n) = Succ <$> duplicate n
33 | add : LNat -@ LNat -@ LNat
35 | add (Succ v) x = Succ (add v x)
39 | mult : (1 n : LNat) -> (0 l : LNat) -> {auto 1 ls : toNat n `Copies` l} -> LNat
40 | mult Zero x {ls = []} = Zero
41 | mult (Succ v) x {ls = x :: ls} = add x (mult {ls} v x)
45 | square : (1 v : LNat) -> {auto 1 vs : toNat v `Copies` v} -> LNat
46 | square v {vs} = mult {ls = vs} v v