-- 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. -- --
-- 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. -- --
-- forall (r :: Round) (a :: Integer) (b :: Integer). -- (b /= 0) => -- Rem r a b == a - b * Div r a b ---- --
-- 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. -- --