Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package ghc-th-compat for openSUSE:Factory 
checked in at 2021-09-10 23:41:14
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/ghc-th-compat (Old)
 and      /work/SRC/openSUSE:Factory/.ghc-th-compat.new.1899 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "ghc-th-compat"

Fri Sep 10 23:41:14 2021 rev:5 rq:917499 version:0.1.3

Changes:
--------
--- /work/SRC/openSUSE:Factory/ghc-th-compat/ghc-th-compat.changes      
2021-03-17 20:19:38.655292041 +0100
+++ /work/SRC/openSUSE:Factory/.ghc-th-compat.new.1899/ghc-th-compat.changes    
2021-09-10 23:41:31.534573067 +0200
@@ -1,0 +2,8 @@
+Fri Sep  3 13:23:34 UTC 2021 - [email protected]
+
+- Update th-compat to version 0.1.3.
+  ### 0.1.3 [2021.08.29]
+  * Implement `qGetDoc` and `qPutDoc` in the `Quasi` instance for 
`QuoteToQuasi`.
+  * Add `expToSplice`.
+
+-------------------------------------------------------------------

Old:
----
  th-compat-0.1.2.tar.gz

New:
----
  th-compat-0.1.3.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ ghc-th-compat.spec ++++++
--- /var/tmp/diff_new_pack.DeopsY/_old  2021-09-10 23:41:31.938573497 +0200
+++ /var/tmp/diff_new_pack.DeopsY/_new  2021-09-10 23:41:31.942573501 +0200
@@ -19,7 +19,7 @@
 %global pkg_name th-compat
 %bcond_with tests
 Name:           ghc-%{pkg_name}
-Version:        0.1.2
+Version:        0.1.3
 Release:        0
 Summary:        Backward- (and forward-)compatible Quote and Code types
 License:        BSD-3-Clause

++++++ th-compat-0.1.2.tar.gz -> th-compat-0.1.3.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/th-compat-0.1.2/CHANGELOG.md 
new/th-compat-0.1.3/CHANGELOG.md
--- old/th-compat-0.1.2/CHANGELOG.md    2001-09-09 03:46:40.000000000 +0200
+++ new/th-compat-0.1.3/CHANGELOG.md    2001-09-09 03:46:40.000000000 +0200
@@ -1,3 +1,7 @@
+### 0.1.3 [2021.08.29]
+* Implement `qGetDoc` and `qPutDoc` in the `Quasi` instance for `QuoteToQuasi`.
+* Add `expToSplice`.
+
 ### 0.1.2 [2021.03.12]
 * Add `bindSplice`, `bindSplice_`, `examineSplice`, `joinSplice`,
   `hoistSplice`, `liftSplice`, and `unTypeSplice` to
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/th-compat-0.1.2/README.md 
new/th-compat-0.1.3/README.md
--- old/th-compat-0.1.2/README.md       2001-09-09 03:46:40.000000000 +0200
+++ new/th-compat-0.1.3/README.md       2001-09-09 03:46:40.000000000 +0200
@@ -23,3 +23,67 @@
 from `Language.Haskell.TH.Syntax`. Refer to the Haddocks
 for `Language.Haskell.TH.Syntax.Compat` for examples of
 how to use this module.
+
+## Quick Start Guide
+
+Let's say you have a library that offers a `foo :: Q (TExp a)`,
+you want to make it compatible with the new `Code` type,
+and you intend that `foo` is spliced directly in to user code.
+
+Use `SpliceQ` as a type alias for the return of your
+function. This is `Q (TExp a)` prior to GHC 9, and `Code Q a`
+after.  This allows your code to be spliced in regardless of
+GHC version.
+
+Use `liftSplice` to convert a `m (TExp a)` into a `Splice m a`.
+
+Use `examineSplice` before typed quoters. This will allow
+a typed quasiquotation to work regardless of GHC version.
+
+When splicing in a `TExp a` value into a typed quoter, use `expToSplice`.
+
+For a real life example, consider [this conversion, from this 
PR](https://github.com/parsonsmatt/discover-instances/pull/2):
+
+```haskell
+discoverInstances
+    :: forall c. (Typeable c)
+    => Q (TExp [SomeDict c])
+discoverInstances = do
+    let className = show (typeRep (Proxy @c))
+    instanceDecs <- reifyInstances (mkName className) [VarT (mkName "a")]
+
+    dicts <- fmap listTE $ traverse decToDict instanceDecs
+
+    [|| concat $$(pure dicts) ||]
+
+listTE :: [TExp a] -> TExp [a]
+listTE = TExp . ListE . map unType
+
+decToDict :: InstanceDec -> Q (TExp [SomeDict c])
+```
+
+With GHC 9, this will have the following problems:
+
+1. `reifyInstances` operates in `Q`, not `Code`, so it will not type check 
with the `[|| concat $$(pure dicts) ||]` line.
+2. We cannot call `pure` in `Code`, since `Code` is not an applicative.
+3. Typed quasiquotes return a `Quote m => Code m a`, not `Q (TExp a)`.
+
+To fix these problems, we make the following diff:
+
+```diff
+ discoverInstances
+     :: forall c. (Typeable c)
+-    => Q (TExp [SomeDict c])
++    => SpliceQ [SomeDict c]
+- discoverInstances = do
++ discoverInstances = liftSplice $ do
+     let className = show (typeRep (Proxy @c))
+     instanceDecs <- reifyInstances (mkName className) [VarT (mkName "a")]
+
+     dicts <- fmap listTE $ traverse decToDict instanceDecs
+
+-     [|| concat $$(pure dicts) ||]
++     examineSplice [|| concat $$(expToSplice dicts) ||]
+```
+
+The above pattern should work to ensure that code is compatible across a wide 
range of GHC versions.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/th-compat-0.1.2/src/Language/Haskell/TH/Syntax/Compat.hs 
new/th-compat-0.1.3/src/Language/Haskell/TH/Syntax/Compat.hs
--- old/th-compat-0.1.2/src/Language/Haskell/TH/Syntax/Compat.hs        
2001-09-09 03:46:40.000000000 +0200
+++ new/th-compat-0.1.3/src/Language/Haskell/TH/Syntax/Compat.hs        
2001-09-09 03:46:40.000000000 +0200
@@ -67,7 +67,8 @@
   , bindCode_
   , joinCode
 
-  -- * @Splice@
+  -- * Compatibility with @Splice@s
+  -- $splice
   , Splice
   , SpliceQ
   , bindSplice
@@ -79,6 +80,7 @@
   , liftTypedFromUntypedSplice
   , unsafeSpliceCoerce
   , unTypeSplice
+  , expToSplice
 #endif
   ) where
 
@@ -440,6 +442,10 @@
 #if MIN_VERSION_template_haskell(2,16,0)
   qReifyType          = qtqError "qReifyType"
 #endif
+#if MIN_VERSION_template_haskell(2,18,0)
+  qGetDoc             = qtqError "qGetDoc"
+  qPutDoc             = qtqError "qPutDoc"
+#endif
 
 -------------------------------------------------------------------------------
 -- Code
@@ -684,6 +690,42 @@
 joinCode = flip bindCode id
 # endif
 
+-- $splice
+--
+-- This section of code is useful for library authors looking to provide
+-- a typed @TemplateHaskell@ interface that is backwards- and
+-- forward-compatible. This section may be useful for you if you
+-- specifically intend for the splice to be done directly.
+--
+-- Prior to GHC 9, you'd offer a value with type @'Q' ('Syntax.TExp' a)@.
+-- After GHC 9, these values are no longer acceptable in a typed splice:
+-- typed splices must operate in @Code m a@ instead.
+--
+-- The @'Splice' m a@ type is used to work with both versions - it is a type
+-- alias, and depending on the version of @template-haskell@ that was
+-- compiled, it will either be @'Code' m a@ or @m ('Syntax.TExp' a)@.
+--
+-- The function 'liftSplice' can be used to convert a @'Q' ('Syntax.TExp' a)@
+-- expression into a @'Code' 'Q' a@ expression in a compatible manner - by
+-- lifting to 'SpliceQ', you get the right behavior depending on your
+-- @template-haskell@ version.
+--
+-- The function 'examineSplice' can be used on typed QuasiQuoters, and the
+-- result will be converted into an appropriate @m ('Syntax.TExp' a)@. This
+-- allows you to use typed quasiquoters in a @do@ block, much like
+-- 'examineCode' does with 'Code'.
+--
+-- With 'expToSplice', you can substitute uses of 'pure' when given the
+-- specific type:
+--
+-- @
+-- pureTExp :: 'Syntax.TExp' a -> 'Q' ('Syntax.TExp' a)
+-- pureTExp = pure
+-- @
+--
+-- This allows you to splice @'Syntax.TExp' a@ values directly into a typed
+-- quasiquoter.
+
 -- | @'Splice' m a@ is a type alias for:
 --
 -- * @'Code' m a@, if using @template-haskell-2.17.0.0@ or later, or
@@ -764,6 +806,68 @@
 bindSplice_ q c = liftSplice ( q >> examineSplice c)
 # endif
 
+-- | Lift a @'Syntax.TExp' a@ into a 'Splice'. This is useful when splicing
+-- in the result of a computation into a typed QuasiQuoter.
+--
+-- One example is 'traverse'ing over a list of elements and returning an
+-- expression from each element.
+--
+-- @
+-- mkInt :: 'String' -> 'Q' ('Syntax.TExp' 'Int')
+-- mkInt str = [|| length $$str ||]
+--
+-- mkInts :: ['String'] -> 'Q' ['Syntax.TExp' 'Int']
+-- mkInts = traverse mkInt
+-- @
+--
+-- This gives us a list of 'Syntax.TExp', not a 'Syntax.TExp' of a list. We
+-- can push the list inside the type with this function:
+--
+-- @
+-- listTE :: ['Syntax.TExp' a] -> 'Syntax.TExp' [a]
+-- listTE = 'Syntax.TExp' . 'Syntax.ListE' . 'map' 'Syntax.unType'
+-- @
+--
+-- In a @do@ block using 'liftSplice', we can bind the resulting
+--
+-- @'Syntax.TExp' ['Int']@ out of the expression.
+--
+-- @
+-- foo :: 'Q' ('Syntax.TExp' Int)
+-- foo = do
+--      ints <- mkInts ["hello", "world", "goodybe", "bob"]
+--      [|| sum $$(pure (listTE ints)) ||]
+-- @
+--
+-- Prior to GHC 9, with the 'Q' type, we can write @'pure' :: 'Syntax.TExp' a 
-> 'Q' ('Syntax.TExp' a)@,
+-- which is a valid thing to use in a typed quasiquoter.
+-- However, after GHC 9, this code will fail to type check. There is no
+-- 'Applicative' instance for @'Code' m a@, so we need another way to
+-- splice it in.
+--
+-- A GHC 9 only solution can use @'Code' :: m ('Syntax.TExp' a) -> Code
+-- m a@ and 'pure' together, like: @'Code' . 'pure'@.
+--
+-- With 'expToSplice', we can splice it in a backwards compatible way.
+-- A fully backwards- and forwards-compatible example looks like this:
+--
+-- @
+-- mkInt :: 'String' -> 'Q' 'Int'
+-- mkInt str = 'examineSplice' [|| length $$str ||]
+--
+-- mkInts :: ['String'] -> 'Q' ['Syntax.TExp' 'Int']
+-- mkInts = traverse mkInt
+--
+-- foo :: 'SpliceQ' 'Int'
+-- foo = 'liftSplice' $ do
+--      ints <- mkInts ["hello", "world", "goodybe", "bob"]
+--      'examineSplice' [|| sum $$(expToSplice (listTE ints)) ||]
+-- @
+--
+-- @since ????.??.??
+expToSplice :: Applicative m => Syntax.TExp a -> Splice m a
+expToSplice a = liftSplice $ pure a
+
 -- | A variant of 'examineCode' that takes a 'Splice' as an argument. Because
 -- this function takes a 'Splice' as an argyment, the type of this function
 -- will be different depending on which version of @template-haskell@ you are
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/th-compat-0.1.2/th-compat.cabal 
new/th-compat-0.1.3/th-compat.cabal
--- old/th-compat-0.1.2/th-compat.cabal 2001-09-09 03:46:40.000000000 +0200
+++ new/th-compat-0.1.3/th-compat.cabal 2001-09-09 03:46:40.000000000 +0200
@@ -1,6 +1,6 @@
 cabal-version:       >=1.10
 name:                th-compat
-version:             0.1.2
+version:             0.1.3
 synopsis:            Backward- (and forward-)compatible Quote and Code types
 description:         This package defines a "Language.Haskell.TH.Syntax.Compat"
                      module, which backports the @Quote@ and @Code@ types to
@@ -30,8 +30,9 @@
                    , GHC == 8.4.4
                    , GHC == 8.6.5
                    , GHC == 8.8.4
-                   , GHC == 8.10.4
+                   , GHC == 8.10.7
                    , GHC == 9.0.1
+                   , GHC == 9.2.*
 extra-source-files:  CHANGELOG.md, README.md
 
 source-repository head
@@ -41,7 +42,7 @@
 library
   exposed-modules:     Language.Haskell.TH.Syntax.Compat
   build-depends:       base             >= 4.3 && < 5
-                     , template-haskell >= 2.5 && < 2.18
+                     , template-haskell >= 2.5 && < 2.19
   if !impl(ghc >= 8.0)
     build-depends:     fail             == 4.9.*
                      , transformers     >= 0.2 && < 0.6
@@ -57,10 +58,10 @@
   other-modules:       Language.Haskell.TH.Syntax.CompatSpec
                        Types
   build-depends:       base             >= 4.3 && < 5
-                     , base-compat      >= 0.6 && < 0.12
+                     , base-compat      >= 0.6 && < 0.13
                      , hspec            >= 2   && < 3
                      , mtl              >= 2.1 && < 2.3
-                     , template-haskell >= 2.5 && < 2.18
+                     , template-haskell >= 2.5 && < 2.19
                      , th-compat
   build-tool-depends:  hspec-discover:hspec-discover >= 2
   hs-source-dirs:      tests

Reply via email to