[Git][ghc/ghc][wip/T23478] Move definitions of SNat, SChar and SSymbol to ghc-internal
Oleg Grenrus (@phadej)
gitlab at gitlab.haskell.org
Wed Dec 6 20:12:33 UTC 2023
Oleg Grenrus pushed to branch wip/T23478 at Glasgow Haskell Compiler / GHC
Commits:
3240dcbd by Oleg Grenrus at 2023-12-06T22:12:22+02:00
Move definitions of SNat, SChar and SSymbol to ghc-internal
... and expose their constructors there
- - - - -
5 changed files:
- libraries/base/src/GHC/TypeLits.hs
- libraries/base/src/GHC/TypeNats.hs
- libraries/ghc-internal/ghc-internal.cabal
- + libraries/ghc-internal/src/GHC/TypeLits/Internal.hs
- + libraries/ghc-internal/src/GHC/TypeNats/Internal.hs
Changes:
=====================================
libraries/base/src/GHC/TypeLits.hs
=====================================
@@ -12,11 +12,15 @@
{-# LANGUAGE MagicHash #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE GADTs #-}
+{-# LANGUAGE PackageImports #-}
{-# LANGUAGE PatternSynonyms #-}
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE ViewPatterns #-}
{-# LANGUAGE RoleAnnotations #-}
+-- orphan instances for SChar and SSymbol
+{-# OPTIONS_GHC -Wno-orphans #-}
+
{-|
GHC's @DataKinds@ language extension lifts data constructors, natural
numbers, and strings to the type level. This module provides the
@@ -69,7 +73,7 @@ module GHC.TypeLits
) where
-import GHC.Base ( Bool(..), Eq(..), Functor(..), Ord(..), Ordering(..), String
+import GHC.Base ( Eq(..), Functor(..), Ord(..), Ordering(..), String
, (.), otherwise, withDict, Void, (++)
, errorWithoutStackTrace)
import GHC.Types(Symbol, Char, TYPE)
@@ -90,6 +94,11 @@ import Unsafe.Coerce(unsafeCoerce)
import GHC.TypeLits.Internal(CmpSymbol, CmpChar)
import qualified GHC.TypeNats as N
+-- PackageImports can be removed once base's GHC.TypeLits.Internal
+-- is hidden and renamed
+-- https://github.com/haskell/core-libraries-committee/issues/217
+import "ghc-internal" GHC.TypeLits.Internal
+
--------------------------------------------------------------------------------
-- | This class gives the string associated with a type-level symbol.
@@ -325,24 +334,6 @@ withSomeSNat n k
| n >= 0 = N.withSomeSNat (fromInteger n) (\sn -> k (Just sn))
| otherwise = k Nothing
--- | A value-level witness for a type-level symbol. This is commonly referred
--- to as a /singleton/ type, as for each @s@, there is a single value that
--- inhabits the type @'SSymbol' s@ (aside from bottom).
---
--- The definition of 'SSymbol' is intentionally left abstract. To obtain an
--- 'SSymbol' value, use one of the following:
---
--- 1. The 'symbolSing' method of 'KnownSymbol'.
---
--- 2. The @SSymbol@ pattern synonym.
---
--- 3. The 'withSomeSSymbol' function, which creates an 'SSymbol' from a
--- 'String'.
---
--- @since 4.18.0.0
-newtype SSymbol (s :: Symbol) = UnsafeSSymbol String
-type role SSymbol nominal
-
-- | A explicitly bidirectional pattern synonym relating an 'SSymbol' to a
-- 'KnownSymbol' constraint.
--
@@ -377,14 +368,6 @@ data KnownSymbolInstance (s :: Symbol) where
knownSymbolInstance :: SSymbol s -> KnownSymbolInstance s
knownSymbolInstance ss = withKnownSymbol ss KnownSymbolInstance
--- | @since 4.19.0.0
-instance Eq (SSymbol s) where
- _ == _ = True
-
--- | @since 4.19.0.0
-instance Ord (SSymbol s) where
- compare _ _ = EQ
-
-- | @since 4.18.0.0
instance Show (SSymbol s) where
showsPrec p (UnsafeSSymbol s)
@@ -429,22 +412,7 @@ withSomeSSymbol s k = k (UnsafeSSymbol s)
-- For details see Note [NOINLINE withSomeSNat] in "GHC.TypeNats"
-- The issue described there applies to `withSomeSSymbol` as well.
--- | A value-level witness for a type-level character. This is commonly referred
--- to as a /singleton/ type, as for each @c@, there is a single value that
--- inhabits the type @'SChar' c@ (aside from bottom).
---
--- The definition of 'SChar' is intentionally left abstract. To obtain an
--- 'SChar' value, use one of the following:
---
--- 1. The 'charSing' method of 'KnownChar'.
---
--- 2. The @SChar@ pattern synonym.
---
--- 3. The 'withSomeSChar' function, which creates an 'SChar' from a 'Char'.
---
--- @since 4.18.0.0
-newtype SChar (s :: Char) = UnsafeSChar Char
-type role SChar nominal
+
-- | A explicitly bidirectional pattern synonym relating an 'SChar' to a
-- 'KnownChar' constraint.
@@ -480,14 +448,6 @@ data KnownCharInstance (n :: Char) where
knownCharInstance :: SChar c -> KnownCharInstance c
knownCharInstance sc = withKnownChar sc KnownCharInstance
--- | @since 4.19.0.0
-instance Eq (SChar c) where
- _ == _ = True
-
--- | @since 4.19.0.0
-instance Ord (SChar c) where
- compare _ _ = EQ
-
-- | @since 4.18.0.0
instance Show (SChar c) where
showsPrec p (UnsafeSChar c)
=====================================
libraries/base/src/GHC/TypeNats.hs
=====================================
@@ -14,10 +14,14 @@
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE GADTs #-}
+{-# LANGUAGE PackageImports #-}
{-# LANGUAGE PatternSynonyms #-}
{-# LANGUAGE ViewPatterns #-}
{-# LANGUAGE RoleAnnotations #-}
+-- orphan instances for SNat
+{-# OPTIONS_GHC -Wno-orphans #-}
+
{-| This module is an internal GHC module. It declares the constants used
in the implementation of type-level natural numbers. The programmer interface
for working with type-level naturals should be defined in a separate library.
@@ -67,6 +71,11 @@ import Unsafe.Coerce(unsafeCoerce)
import GHC.TypeNats.Internal(CmpNat)
+-- PackageImports can be removed once base's GHC.TypeNats.Internal
+-- is hidden and renamed
+-- https://github.com/haskell/core-libraries-committee/issues/217
+import "ghc-internal" GHC.TypeNats.Internal
+
-- | A type synonym for 'Natural'.
--
-- Previously, this was an opaque data type, but it was changed to a type
@@ -329,23 +338,7 @@ cmpNat x y = case compare (natVal x) (natVal y) of
--------------------------------------------------------------------------------
-- Singleton values
--- | A value-level witness for a type-level natural number. This is commonly
--- referred to as a /singleton/ type, as for each @n@, there is a single value
--- that inhabits the type @'SNat' n@ (aside from bottom).
---
--- The definition of 'SNat' is intentionally left abstract. To obtain an 'SNat'
--- value, use one of the following:
---
--- 1. The 'natSing' method of 'KnownNat'.
---
--- 2. The @SNat@ pattern synonym.
---
--- 3. The 'withSomeSNat' function, which creates an 'SNat' from a 'Natural'
--- number.
---
--- @since 4.18.0.0
-newtype SNat (n :: Nat) = UnsafeSNat Natural
-type role SNat nominal
+
-- | A explicitly bidirectional pattern synonym relating an 'SNat' to a
-- 'KnownNat' constraint.
@@ -381,14 +374,6 @@ data KnownNatInstance (n :: Nat) where
knownNatInstance :: SNat n -> KnownNatInstance n
knownNatInstance sn = withKnownNat sn KnownNatInstance
--- | @since 4.19.0.0
-instance Eq (SNat n) where
- _ == _ = True
-
--- | @since 4.19.0.0
-instance Ord (SNat n) where
- compare _ _ = EQ
-
-- | @since 4.18.0.0
instance Show (SNat n) where
showsPrec p (UnsafeSNat n)
=====================================
libraries/ghc-internal/ghc-internal.cabal
=====================================
@@ -23,9 +23,10 @@ common warnings
library
import: warnings
+
exposed-modules:
- other-modules: Dummy
- other-extensions:
+ GHC.TypeLits.Internal
+ GHC.TypeNats.Internal
build-depends: rts == 1.0.*,
ghc-prim >= 0.5.1.0 && < 0.11,
ghc-bignum >= 1.0 && < 2.0
=====================================
libraries/ghc-internal/src/GHC/TypeLits/Internal.hs
=====================================
@@ -0,0 +1,63 @@
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE KindSignatures #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# LANGUAGE RoleAnnotations #-}
+module GHC.TypeLits.Internal (
+ SChar (..),
+ SSymbol (..),
+) where
+
+import GHC.Types (Char, Symbol, Bool (..), Ordering (..))
+import GHC.Classes (Eq (..), Ord (..))
+import GHC.Num.Integer () -- Note [Depend on GHC.Num.Integer] in GHC.Base
+
+-- | A value-level witness for a type-level character. This is commonly referred
+-- to as a /singleton/ type, as for each @c@, there is a single value that
+-- inhabits the type @'SChar' c@ (aside from bottom).
+--
+-- The definition of 'SChar' is intentionally left abstract. To obtain an
+-- 'SChar' value, use one of the following:
+--
+-- 1. The 'charSing' method of 'KnownChar'.
+--
+-- 2. The @SChar@ pattern synonym.
+--
+-- 3. The 'withSomeSChar' function, which creates an 'SChar' from a 'Char'.
+--
+-- /since base-4.18.0.0/
+newtype SChar (s :: Char) = UnsafeSChar Char
+type role SChar nominal
+
+-- | /since base-4.19.0.0/
+instance Eq (SChar c) where
+ _ == _ = True
+
+-- | /since base-4.19.0.0/
+instance Ord (SChar c) where
+ compare _ _ = EQ
+
+-- | A value-level witness for a type-level symbol. This is commonly referred
+-- to as a /singleton/ type, as for each @s@, there is a single value that
+-- inhabits the type @'SSymbol' s@ (aside from bottom).
+--
+-- The definition of 'SSymbol' is intentionally left abstract. To obtain an
+-- 'SSymbol' value, use one of the following:
+--
+-- 1. The 'symbolSing' method of 'KnownSymbol'.
+--
+-- 2. The @SSymbol@ pattern synonym.
+--
+-- 3. The 'withSomeSSymbol' function, which creates an 'SSymbol' from a
+-- 'String'.
+--
+-- /since base-4.18.0.0/
+newtype SSymbol (s :: Symbol) = UnsafeSSymbol [Char]
+type role SSymbol nominal
+
+-- | /since base-4.19.0.0/
+instance Eq (SSymbol s) where
+ _ == _ = True
+
+-- | /since base-4.19.0.0/
+instance Ord (SSymbol s) where
+ compare _ _ = EQ
=====================================
libraries/ghc-internal/src/GHC/TypeNats/Internal.hs
=====================================
@@ -0,0 +1,38 @@
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE KindSignatures #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# LANGUAGE RoleAnnotations #-}
+module GHC.TypeNats.Internal (
+ SNat (..),
+)where
+
+import GHC.Num.Natural(Natural)
+import GHC.Types (Bool (..), Ordering (..))
+import GHC.Classes (Eq (..), Ord (..))
+
+-- | A value-level witness for a type-level natural number. This is commonly
+-- referred to as a /singleton/ type, as for each @n@, there is a single value
+-- that inhabits the type @'SNat' n@ (aside from bottom).
+--
+-- The definition of 'SNat' is intentionally left abstract. To obtain an 'SNat'
+-- value, use one of the following:
+--
+-- 1. The 'natSing' method of 'KnownNat'.
+--
+-- 2. The @SNat@ pattern synonym.
+--
+-- 3. The 'withSomeSNat' function, which creates an 'SNat' from a 'Natural'
+-- number.
+--
+-- /since base-4.18.0.0/
+--
+newtype SNat (n :: Natural) = UnsafeSNat Natural
+type role SNat nominal
+
+-- | /since base-4.19.0.0/
+instance Eq (SNat n) where
+ _ == _ = True
+
+-- | /since 4.19.0.0/
+instance Ord (SNat n) where
+ compare _ _ = EQ
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/commit/3240dcbd27f77f19465be44e8cf56d8eb0f27572
--
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/commit/3240dcbd27f77f19465be44e8cf56d8eb0f27572
You're receiving this email because of your account on gitlab.haskell.org.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/ghc-commits/attachments/20231206/10c0b605/attachment-0001.html>
More information about the ghc-commits
mailing list