33{-# LANGUAGE EmptyCase #-}
44{-# LANGUAGE GADTs #-}
55{-# LANGUAGE KindSignatures #-}
6+ {-# LANGUAGE PatternSynonyms #-}
67{-# LANGUAGE RankNTypes #-}
78{-# LANGUAGE ScopedTypeVariables #-}
89{-# LANGUAGE StandaloneDeriving #-}
910{-# LANGUAGE Trustworthy #-}
1011{-# LANGUAGE TypeFamilies #-}
1112{-# LANGUAGE TypeOperators #-}
1213{-# LANGUAGE UndecidableInstances #-}
14+ {-# LANGUAGE ViewPatterns #-}
1315-- | 'Nat' numbers. @DataKinds@ stuff.
1416--
1517-- This module re-exports "Data.Nat", and adds type-level things.
@@ -23,7 +25,7 @@ module Data.Type.Nat (
2325 explicitShow ,
2426 explicitShowsPrec ,
2527 -- * Singleton
26- SNat (.. ),
28+ SNat (SZ , SS , SS' ),
2729 snatToNat ,
2830 snatToNatural ,
2931 -- * Implicit
@@ -177,6 +179,35 @@ snatToNatural :: forall n. SNat n -> Natural
177179snatToNatural SZ = 0
178180snatToNatural SS = unKonst (induction (Konst 0 ) (kmap succ ) :: Konst Natural n )
179181
182+ -------------------------------------------------------------------------------
183+ -- Explicit constructor
184+ -------------------------------------------------------------------------------
185+
186+ data SNat_ (n :: Nat ) where
187+ SZ_ :: SNat_ 'Z
188+ SS_ :: SNat n -> SNat_ ('S n )
189+
190+ snat_ :: SNat n -> SNat_ n
191+ snat_ SZ = SZ_
192+ snat_ SS = SS_ snat
193+
194+ -- | A pattern with explicit argument
195+ --
196+ -- >>> let predSNat :: SNat (S n) -> SNat n; predSNat (SS' n) = n
197+ -- >>> predSNat (SS' (SS' SZ))
198+ -- SS
199+ --
200+ -- >>> reflect $ predSNat (SS' (SS' SZ))
201+ -- 1
202+ --
203+ --
204+ -- @since 0.3.2
205+ pattern SS' :: () => (m ~ 'S n ) => SNat n -> SNat m
206+ pattern SS' n <- (snat_ -> SS_ n)
207+ where SS' n = withSNat n SS
208+
209+ {-# COMPLETE SZ, SS' #-}
210+
180211-------------------------------------------------------------------------------
181212-- Equality
182213-------------------------------------------------------------------------------
0 commit comments