-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | Type-level integers. Like KnownNat, but for integers. -- -- Type-level integers. Like KnownNat, but for integers. @package kind-integer @version 0.6.0 -- | This module provides a type-level representation for term-level -- Integers. This type-level representation is also named -- Integer, So import this module qualified to avoid name -- conflicts. -- --
--   import KindInteger qualified as KI
--   
-- -- The implementation details are similar to the ones for type-level -- Naturals as of base-4.18 and -- singletons-base-3.1.1, and they will continue to evolve -- together with base and singletons-base, trying to -- more or less follow their API. module KindInteger -- | Type-level version of Integer, only used as a kind. -- -- data Integer -- | Zero is represented as Z. type Z = 'Z :: Integer -- |
--   SZ == sing @Z
--   
pattern SZ :: SInteger Z -- | A negative number -x is represented as N x. -- -- While a standalone N 0 type-checks, it is not -- considered valid, so tools like KnownInteger or -- Normalized will reject it. N 0 itself is not -- rejected so that it can be used to pattern-match against -- Integers at the type-level if necessary. type N (x :: Natural) = 'N x :: Integer -- |
--   SN (sing @1) == sing @(N 1)
--   
pattern SN :: 0 < x => (KnownInteger (N x), KnownNat x) => Sing (x :: Natural) -> SInteger (N x) -- | A positive number +x is represented as P x. -- -- While a standalone P 0 type-checks, it is not -- considered valid, so tools like KnownInteger or -- Normalized will reject it. P 0 itself is not -- rejected so that it can be used to pattern-match against -- Integers at the type-level if necessary. type P (x :: Natural) = 'P x :: Integer -- |
--   SP (sing @1) == sing @(P 1)
--   
pattern SP :: 0 < x => (KnownInteger (P x), KnownNat x) => Sing (x :: Natural) -> SInteger (P x) -- | Construct a type-level Integer from a type-level -- Natural. type family FromNatural (x :: Natural) :: Integer -- | Singleton version of FromNatural. sFromNatural :: Sing (x :: Natural) -> SInteger (FromNatural x) -- | Fold z n p i evaluates to z if i is -- zero, otherwise applies n to the absolute value of i -- if negative, or p to the absolute value of i if -- positive. N 0 and P 0 fail to -- type-check. type family Fold (z :: k) (n :: Natural ~> k) (p :: Natural ~> k) (i :: Integer) :: k -- | Singleton version of Fold. sFold :: SingKind k => Sing (z :: k) -> Sing (n :: Natural ~> k) -> Sing (p :: Natural ~> k) -> SInteger i -> Sing (Fold z n p i) -- | Type-level Integers satisfying KnownInteger can be -- converted to SIntegers using integerSing. Every -- Integer other than Integer 0 and -- Integer 0 are KnownIntegers. type KnownInteger (i :: Integer) = (KnownInteger_ i, Normalized i ~ i, KnownNat (Abs i)) -- | Normalized i is an identity function that fails to -- type-check if i is not in normalized form. That is, -- zero is represented with Z, not with P 0 -- or N 0. type family Normalized (i :: Integer) :: Integer -- | Convert an implicit KnownInteger to an explicit -- SInteger. integerSing :: KnownInteger i => SInteger i -- | Term-level Prelude.Integer representation of the -- type-level Integer. integerVal :: forall i proxy. KnownInteger i => proxy i -> Integer -- | Convert an explicit SInteger i value into an implicit -- KnownInteger i constraint. withKnownInteger :: forall i rep (x :: TYPE rep). SInteger i -> (KnownInteger i => x) -> x -- | Term-level representation of an existentialized KnownInteger. data SomeInteger SomeInteger :: Proxy i -> SomeInteger -- | Convert a term-level Prelude.Integer into an -- extistentialized KnownInteger wrapped in SomeInteger. someIntegerVal :: Integer -> SomeInteger -- | Singleton type for a type-level Integer i. data SInteger (i :: Integer) -- | A explicitly bidirectional pattern synonym relating an SInteger -- to a KnownInteger constraint. -- -- As an expression: Constructs an explicit SInteger -- i value from an implicit KnownInteger i -- constraint: -- --
--   SInteger @i :: KnownInteger i => SInteger i
--   
-- -- As a pattern: Matches on an explicit SInteger i -- value bringing an implicit KnownInteger i constraint -- into scope: -- --
--   f :: SInteger i -> ..
--   f si@SInteger = ... both (si :: SInteger i) and (KnownInteger i) in scope ...
--   
pattern SInteger :: forall i. () => KnownInteger i => SInteger i -- | Return the term-level Prelude.Integer number -- corresponding to i. fromSInteger :: SInteger i -> Integer -- | Convert a Prelude.Integer number into an -- SInteger n value, where n is a fresh -- type-level Integer. withSomeSInteger :: forall rep (x :: TYPE rep). Integer -> (forall (i :: Integer). Sing i -> x) -> x -- | Double negation is identity. sNegateRefl :: SInteger i -> i :~: Negate (Negate i) -- | Identity. sZigZagRefl :: SInteger i -> i :~: ZagZig (ZigZag i) -- | Identity. sZagZigRefl :: Sing (n :: Natural) -> n :~: ZigZag (ZagZig n) -- | Displays i as it would show literally as a type. -- --
--   ShowLit ( N 1) ~ "P 1"
--   ShowLit   Z    ~ "Z"
--   ShowLit ( P 1) ~ "P 1"
--   
-- -- N 0 and P 0 fail to type-check. type ShowLit (i :: Integer) = ShowsLit i "" :: Symbol -- | Demoted version of ShowLit. showLit :: Integer -> String -- | Singleton version of ShowLit. -- --
--   fromSing @(sShowLit (SN (sing @1))) == "N 1"
--   fromSing @(sShowLit SZ)             == "Z"
--   fromSing @(sShowLit (SP (sing @1))) == "P 1"
--   
sShowLit :: SInteger i -> Sing (ShowLit i) -- | Displays i as it would show literally as a type. See -- 'ShowLit. Behaves like Shows. type ShowsLit (i :: Integer) (s :: Symbol) = ShowsPrecLit 0 i s :: Symbol -- | Demoted version of ShowsLit. showsLit :: Integer -> ShowS -- | Singleton version of ShowsLit. sShowsLit :: SInteger i -> Sing (s :: Symbol) -> Sing (ShowsLit i s) -- | Displays i as it would show literally as a type. See -- 'ShowLit. Behaves like ShowsPrec. type ShowsPrecLit p i s = ShowsPrecLit_ p (Normalized i) s -- | Demoted version of ShowsPrecLit. showsPrecLit :: Int -> Integer -> ShowS -- | Singleton version of ShowsPrecLit. sShowsPrecLit :: Sing (p :: Natural) -> SInteger i -> Sing (s :: Symbol) -> Sing (ShowsPrecLit p i s) -- | Inverse of showsPrecLit. readPrecLit :: ReadPrec Integer -- | Exponentiation of type-level Integers. type (b :: Integer) ^ (p :: Natural) = Pow (Normalized b) p :: Integer infixr 8 ^ -- | Singleton version of ^. (%^) :: Sing (b :: Integer) -> Sing (p :: Natural) -> Sing (b ^ p :: Integer) infixr 8 %^ -- | Whether a type-level Integer is odd. Zero is not -- considered odd. type Odd (i :: Integer) = Mod (Abs i) 2 == 1 :: Bool -- | Singleton version of Odd. sOdd :: SInteger i -> Sing (Odd i :: Bool) -- | Whether a type-level Integer is even. Zero is considered -- even. type Even (i :: Integer) = Mod (Abs i) 2 == 0 :: Bool -- | Singleton version of Even. sEven :: SInteger i -> Sing (Even i :: Bool) -- | Absolute value of a type-level Integer, as a type-level -- Natural. type Abs (i :: Integer) = Fold 0 IdSym0 IdSym0 i :: Natural -- | Singleton version of Abs. sAbs :: SInteger i -> Sing (Abs i :: Natural) -- | Greatest Common Divisor of type-level Integer numbers -- a and b. -- -- Returns a Natural, since the Greatest Common Divisor is always -- positive. type GCD (a :: Integer) (b :: Integer) = NatGCD (Abs a) (Abs b) :: Natural -- | Singleton version of GCD. sGCD :: SInteger a -> SInteger b -> Sing (GCD a b :: Natural) -- | Least Common Multiple of type-level Integer numbers a -- and b. -- -- Returns a Natural, since the Least Common Multiple is always -- positive. type LCM (a :: Integer) (b :: Integer) = NatLCM (Abs a) (Abs b) :: Natural -- | Singleton version of LCM. sLCM :: SInteger a -> SInteger b -> Sing (LCM a b :: Natural) -- | Log base 2 (floored) of type-level Integers. -- -- type Log2 (a :: Integer) = Fold (TypeError ('Text "Logarithm of zero.")) (ConstSym1 (TypeError ('Text "Logarithm of negative number."))) (Log2Sym0) a :: Natural -- | Singleton version of Log2. sLog2 :: SInteger i -> Sing (Log2 i :: Natural) -- | Divide the type-level Integer a by b, using -- the specified Rounding r. -- -- type Div (r :: Round) (a :: Integer) (b :: Integer) = Div_ r (Normalized a) (Normalized b) :: Integer infixl 7 `Div` -- | Singleton version of Div. sDiv :: SRound r -> SInteger a -> SInteger b -> SInteger (Div r a b) -- | Demoted version of Div. -- -- Throws DivdeByZero where Div would fail to type-check. div :: Round -> Integer -> Integer -> Integer -- | Remainder of the division of type-level Integer -- a by b, using the specified Rounding -- r. -- --
--   forall (r :: Round) (a :: Integer) (b :: Integer).
--     (b /= 0) =>
--       Rem r a b  ==  a - b * Div r a b
--   
-- -- type Rem (r :: Round) (a :: Integer) (b :: Integer) = Rem_ r (Normalized a) (Normalized b) :: Integer infixl 7 `Rem` -- | Singleton version of Rem. sRem :: SRound r -> SInteger a -> SInteger b -> SInteger (Rem r a b) -- | Demoted version of Rem. -- -- Throws DivdeByZero where Div would fail to type-check. rem :: Round -> Integer -> Integer -> Integer -- | Get both the quotient and the Remainder of the Division -- of type-level Integers a and b using the -- specified Rounding r. -- --
--   forall (r :: Round) (a :: Integer) (b :: Integer).
--     (b /= 0) =>
--       DivRem r a b ==  '(Div r a b, Rem r a b)
--   
type DivRem (r :: Round) (a :: Integer) (b :: Integer) = '(Div r a b, Rem r a b) :: (Integer, Integer) infixl 7 `DivRem` -- | Singleton version of DivRem. sDivRem :: SRound r -> SInteger a -> SInteger b -> (SInteger (Div r a b), SInteger (Rem r a b)) -- | Demoted version of DivRem. -- -- Throws DivdeByZero where Div would fail to type-check. divRem :: Round -> Integer -> Integer -> (Integer, Integer) -- | Rounding strategy. data Round -- | Round up towards positive infinity. RoundUp :: Round -- | Round down towards negative infinity. Also known as -- Prelude's floor. This is the type of rounding used by -- Prelude's div, mod, divMod, Div, -- Mod. RoundDown :: Round -- | Round towards zero. Also known as Prelude's -- truncate. This is the type of rounding used by Prelude's -- quot, rem, quotRem. RoundZero :: Round -- | Round away from zero. RoundAway :: Round -- | Round towards the closest integer. If halfway between two -- integers, round up towards positive infinity. RoundHalfUp :: Round -- | Round towards the closest integer. If halfway between two -- integers, round down towards negative infinity. RoundHalfDown :: Round -- | Round towards the closest integer. If halfway between two -- integers, round towards zero. RoundHalfZero :: Round -- | Round towards the closest integer. If halfway between two -- integers, round away from zero. RoundHalfAway :: Round -- | Round towards the closest integer. If halfway between two -- integers, round towards the closest even integer. Also known as -- Prelude's round. RoundHalfEven :: Round -- | Round towards the closest integer. If halfway between two -- integers, round towards the closest odd integer. RoundHalfOdd :: Round data SRound :: Round -> Type [SRoundUp] :: SRound ('RoundUp :: Round) [SRoundDown] :: SRound ('RoundDown :: Round) [SRoundZero] :: SRound ('RoundZero :: Round) [SRoundAway] :: SRound ('RoundAway :: Round) [SRoundHalfUp] :: SRound ('RoundHalfUp :: Round) [SRoundHalfDown] :: SRound ('RoundHalfDown :: Round) [SRoundHalfZero] :: SRound ('RoundHalfZero :: Round) [SRoundHalfAway] :: SRound ('RoundHalfAway :: Round) [SRoundHalfEven] :: SRound ('RoundHalfEven :: Round) [SRoundHalfOdd] :: SRound ('RoundHalfOdd :: Round) -- | Like sameInteger, but if the type-level Integers aren't -- equal, this additionally provides proof of LT or GT. cmpInteger :: forall a b proxy1 proxy2. (KnownInteger a, KnownInteger b) => proxy1 a -> proxy2 b -> OrderingI a b -- | We either get evidence that this function was instantiated with the -- same type-level Integers, or Nothing. sameInteger :: forall a b proxy1 proxy2. (KnownInteger a, KnownInteger b) => proxy1 a -> proxy2 b -> Maybe (a :~: b) -- | ZigZag encoding of an Integer. -- -- type ZigZag (i :: Integer) = ZigZag_ (Normalized i) :: Natural -- | Singleton version of ZigZag. sZigZag :: SInteger i -> Sing (ZigZag i :: Natural) -- | Inverse of ZigZag. type ZagZig n = If (Mod n 2 == 1) (Negate (FromNatural (Div (n + 1) 2))) (FromNatural (Div n 2)) -- | Singleton version of ZagZig. sZagZig :: Sing (n :: Natural) -> SInteger (ZagZig n) type ZSym0 = Z data NSym0 :: Natural ~> Integer type NSym1 x = N x data PSym0 :: Natural ~> Integer type PSym1 x = P x data FromNaturalSym0 :: Natural ~> Integer type FromNaturalSym1 i = FromNatural i data KnownIntegerSym0 :: Integer ~> Constraint type KnownIntegerSym1 i = KnownInteger i data NormalizedSym0 :: Integer ~> Integer type NormalizedSym1 i = Normalized i data FoldSym0 :: k ~> (Natural ~> k) ~> (Natural ~> k) ~> Integer ~> k data FoldSym1 :: k -> (Natural ~> k) ~> (Natural ~> k) ~> Integer ~> k data FoldSym2 :: k -> (Natural ~> k) -> (Natural ~> k) ~> Integer ~> k data FoldSym3 :: k -> (Natural ~> k) -> (Natural ~> k) -> Integer ~> k type FoldSym4 z n p i = Fold z n p i data (^@#@$) :: Integer ~> Natural ~> Integer data (^@#@$$) :: Integer -> Natural ~> Integer type (^@#@$$$) b p = b ^ p infixr 8 ^@#@$$$ data OddSym0 :: Integer ~> Bool type OddSym1 i = Odd i data EvenSym0 :: Integer ~> Bool type EvenSym1 i = Even i data GCDSym0 :: Integer ~> Integer ~> Natural data GCDSym1 :: Integer -> Integer ~> Natural data LCMSym0 :: Integer ~> Integer ~> Natural data LCMSym1 :: Integer -> Integer ~> Natural data Log2Sym0 :: Integer ~> Natural type Log2Sym1 a = Log2 a data DivSym0 :: Round ~> Integer ~> Integer ~> Integer data DivSym1 :: Round -> Integer ~> Integer ~> Integer data DivSym2 :: Round -> Integer -> Integer ~> Integer type DivSym3 r a b = Div r a b data RemSym0 :: Round ~> Integer ~> Integer ~> Integer data RemSym1 :: Round -> Integer ~> Integer ~> Integer data RemSym2 :: Round -> Integer -> Integer ~> Integer type RemSym3 r a b = Rem r a b data DivRemSym0 :: Round ~> Integer ~> Integer ~> (Integer, Integer) data DivRemSym1 :: Round -> Integer ~> Integer ~> (Integer, Integer) data DivRemSym2 :: Round -> Integer -> Integer ~> (Integer, Integer) type DivRemSym3 r a b = DivRem r a b data ShowLitSym0 :: Integer ~> Symbol type ShowLitSym1 i = ShowLit i data ShowsLitSym0 :: Integer ~> Symbol ~> Symbol data ShowsLitSym1 :: Integer -> Symbol ~> Symbol type ShowsLitSym2 i s = ShowsLit i s data ShowsPrecLitSym0 :: Natural ~> Integer ~> Symbol ~> Symbol data ShowsPrecLitSym1 :: Natural -> Integer ~> Symbol ~> Symbol data ShowsPrecLitSym2 :: Natural -> Integer -> Symbol ~> Symbol type ShowsPrecLitSym3 p i s = ShowsPrecLit p i s type family RoundUpSym0 :: Round type family RoundDownSym0 :: Round type family RoundZeroSym0 :: Round type family RoundAwaySym0 :: Round type family RoundHalfUpSym0 :: Round type family RoundHalfDownSym0 :: Round type family RoundHalfZeroSym0 :: Round type family RoundHalfAwaySym0 :: Round type family RoundHalfEvenSym0 :: Round type family RoundHalfOddSym0 :: Round instance GHC.Classes.Eq KindInteger.SomeInteger instance GHC.Classes.Ord KindInteger.SomeInteger instance GHC.Show.Show KindInteger.SomeInteger instance GHC.Read.Read KindInteger.SomeInteger instance (KindInteger.KnownInteger (KindInteger.N n), n GHC.Types.~ KindInteger.Abs (KindInteger.N n)) => KindInteger.KnownInteger_ (KindInteger.N n) instance (KindInteger.KnownInteger (KindInteger.P n), n GHC.Types.~ KindInteger.Abs (KindInteger.P n)) => KindInteger.KnownInteger_ (KindInteger.P n) instance KindInteger.KnownInteger i => GHC.Read.Read (KindInteger.SInteger i) instance KindInteger.KnownInteger i => Data.Singletons.SingI i instance KindInteger.KnownInteger_ KindInteger.Z instance GHC.Num.Singletons.SNum KindInteger.Integer instance GHC.Classes.Eq (KindInteger.SInteger i) instance GHC.Classes.Ord (KindInteger.SInteger i) instance GHC.Show.Show (KindInteger.SInteger i) instance Data.Type.Equality.TestEquality KindInteger.SInteger instance Data.Type.Coercion.TestCoercion KindInteger.SInteger instance GHC.Num.Singletons.PNum KindInteger.Integer instance Text.Show.Singletons.PShow KindInteger.Integer instance Text.Show.Singletons.SShow KindInteger.Integer instance Data.Ord.Singletons.POrd KindInteger.Integer instance Data.Ord.Singletons.SOrd KindInteger.Integer instance Data.Eq.Singletons.PEq KindInteger.Integer instance Data.Eq.Singletons.SEq KindInteger.Integer instance Data.Singletons.SingKind KindInteger.Integer instance Data.Singletons.Decide.SDecide KindInteger.Integer