purescript-0.10.4: examples/passing/ForeignKind/Lib.purs
module ForeignKinds.Lib (kind Nat, Kinded, Zero, Succ, N0, N1, N2, N3, NatProxy(..), class AddNat, addNat, proxy1, proxy2) where
-- declaration
foreign import kind Nat
-- use in foreign data
foreign import data Zero :: Nat
foreign import data Succ :: Nat -> Nat
-- use in data
data NatProxy (t :: Nat) = NatProxy
-- use in type sig
succProxy :: forall n. NatProxy n -> NatProxy (Succ n)
succProxy _ = NatProxy
-- use in alias
type Kinded f = f :: Nat
type KindedZero = Kinded Zero
type N0 = Zero
type N1 = Succ N0
type N2 = Succ N1
type N3 = Succ N2
-- use of alias
proxy0 :: NatProxy N0
proxy0 = NatProxy
proxy1 :: NatProxy N1
proxy1 = NatProxy
proxy2 :: NatProxy N2
proxy2 = NatProxy
proxy3 :: NatProxy N3
proxy3 = NatProxy
-- use in class
class AddNat (l :: Nat) (r :: Nat) (o :: Nat) | l -> r o
instance addNatZero
:: AddNat Zero r r
instance addNatSucc
:: AddNat l r o
=> AddNat (Succ l) r (Succ o)
-- use of class
addNat :: forall l r o. AddNat l r o => NatProxy l -> NatProxy r -> NatProxy o
addNat _ _ = NatProxy