Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package ghc-parser-combinators for 
openSUSE:Factory checked in at 2021-02-16 22:38:53
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/ghc-parser-combinators (Old)
 and      /work/SRC/openSUSE:Factory/.ghc-parser-combinators.new.28504 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "ghc-parser-combinators"

Tue Feb 16 22:38:53 2021 rev:12 rq:870875 version:1.3.0

Changes:
--------
--- 
/work/SRC/openSUSE:Factory/ghc-parser-combinators/ghc-parser-combinators.changes
    2020-12-22 11:44:03.337746349 +0100
+++ 
/work/SRC/openSUSE:Factory/.ghc-parser-combinators.new.28504/ghc-parser-combinators.changes
 2021-02-16 22:48:38.798566133 +0100
@@ -1,0 +2,17 @@
+Mon Feb  8 05:05:05 UTC 2021 - [email protected]
+
+- Update parser-combinators to version 1.3.0.
+  ## Parser combinators 1.3.0
+
+  * Changed the `Control.Applicative.Permutations` module to only require
+    `Applicative` and not `Monad`. This module is the least restrictive and 
works
+    with parsers which are not `Monad`s.
+
+  * Added the `Control.Monad.Permutations` module. This module may be
+    substantially more efficient for some parsers which are `Monad`s.
+
+  * Corrected how permutation parsers intercalate effects and components; 
parsing
+    an effect requires that a component immediately follows or else a parse 
error
+    will result.
+
+-------------------------------------------------------------------

Old:
----
  parser-combinators-1.2.1.tar.gz

New:
----
  parser-combinators-1.3.0.tar.gz

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

Other differences:
------------------
++++++ ghc-parser-combinators.spec ++++++
--- /var/tmp/diff_new_pack.rAbdyQ/_old  2021-02-16 22:48:39.346566561 +0100
+++ /var/tmp/diff_new_pack.rAbdyQ/_new  2021-02-16 22:48:39.350566564 +0100
@@ -1,7 +1,7 @@
 #
 # spec file for package ghc-parser-combinators
 #
-# Copyright (c) 2020 SUSE LLC
+# Copyright (c) 2021 SUSE LLC
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -18,7 +18,7 @@
 
 %global pkg_name parser-combinators
 Name:           ghc-%{pkg_name}
-Version:        1.2.1
+Version:        1.3.0
 Release:        0
 Summary:        Lightweight package providing commonly useful parser 
combinators
 License:        BSD-3-Clause

++++++ parser-combinators-1.2.1.tar.gz -> parser-combinators-1.3.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/parser-combinators-1.2.1/CHANGELOG.md 
new/parser-combinators-1.3.0/CHANGELOG.md
--- old/parser-combinators-1.2.1/CHANGELOG.md   2001-09-09 03:46:40.000000000 
+0200
+++ new/parser-combinators-1.3.0/CHANGELOG.md   2001-09-09 03:46:40.000000000 
+0200
@@ -1,3 +1,16 @@
+## Parser combinators 1.3.0
+
+* Changed the `Control.Applicative.Permutations` module to only require
+  `Applicative` and not `Monad`. This module is the least restrictive and works
+  with parsers which are not `Monad`s.
+
+* Added the `Control.Monad.Permutations` module. This module may be
+  substantially more efficient for some parsers which are `Monad`s.
+
+* Corrected how permutation parsers intercalate effects and components; parsing
+  an effect requires that a component immediately follows or else a parse error
+  will result.
+
 ## Parser combinators 1.2.1
 
 * The tests in `parser-combinators-tests` now work with Megaparsec 8.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/parser-combinators-1.2.1/Control/Applicative/Combinators/NonEmpty.hs 
new/parser-combinators-1.3.0/Control/Applicative/Combinators/NonEmpty.hs
--- old/parser-combinators-1.2.1/Control/Applicative/Combinators/NonEmpty.hs    
2001-09-09 03:46:40.000000000 +0200
+++ new/parser-combinators-1.3.0/Control/Applicative/Combinators/NonEmpty.hs    
2001-09-09 03:46:40.000000000 +0200
@@ -11,32 +11,30 @@
 -- from "Control.Applicative.Combinators".
 --
 -- @since 0.2.0
-
 module Control.Applicative.Combinators.NonEmpty
-  ( some
-  , endBy1
-  , someTill
-  , sepBy1
-  , sepEndBy1 )
+  ( some,
+    endBy1,
+    someTill,
+    sepBy1,
+    sepEndBy1,
+  )
 where
 
 import Control.Applicative hiding (some)
-import Data.List.NonEmpty (NonEmpty (..))
 import qualified Control.Applicative.Combinators as C
-import qualified Data.List.NonEmpty              as NE
+import Data.List.NonEmpty (NonEmpty (..))
+import qualified Data.List.NonEmpty as NE
 
 -- | @'some' p@ applies the parser @p@ /one/ or more times and returns a
 -- list of the values returned by @p@.
 --
 -- > word = some letter
-
 some :: Alternative m => m a -> m (NonEmpty a)
 some p = NE.fromList <$> C.some p
 {-# INLINE some #-}
 
 -- | @'endBy1' p sep@ parses /one/ or more occurrences of @p@, separated and
 -- ended by @sep@. Returns a non-empty list of values returned by @p@.
-
 endBy1 :: Alternative m => m a -> m sep -> m (NonEmpty a)
 endBy1 p sep = NE.fromList <$> C.endBy1 p sep
 {-# INLINE endBy1 #-}
@@ -45,14 +43,12 @@
 -- should succeed at least once.
 --
 -- See also: 'C.skipSome', 'C.skipSomeTill'.
-
 someTill :: Alternative m => m a -> m end -> m (NonEmpty a)
 someTill p end = NE.fromList <$> C.someTill p end
 {-# INLINE someTill #-}
 
 -- | @'sepBy1' p sep@ parses /one/ or more occurrences of @p@, separated by
 -- @sep@. Returns a non-empty list of values returned by @p@.
-
 sepBy1 :: Alternative m => m a -> m sep -> m (NonEmpty a)
 sepBy1 p sep = NE.fromList <$> C.sepBy1 p sep
 {-# INLINE sepBy1 #-}
@@ -60,7 +56,6 @@
 -- | @'sepEndBy1' p sep@ parses /one/ or more occurrences of @p@, separated
 -- and optionally ended by @sep@. Returns a non-empty list of values returned 
by
 -- @p@.
-
 sepEndBy1 :: Alternative m => m a -> m sep -> m (NonEmpty a)
 sepEndBy1 p sep = NE.fromList <$> C.sepEndBy1 p sep
 {-# INLINE sepEndBy1 #-}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/parser-combinators-1.2.1/Control/Applicative/Combinators.hs 
new/parser-combinators-1.3.0/Control/Applicative/Combinators.hs
--- old/parser-combinators-1.2.1/Control/Applicative/Combinators.hs     
2001-09-09 03:46:40.000000000 +0200
+++ new/parser-combinators-1.3.0/Control/Applicative/Combinators.hs     
2001-09-09 03:46:40.000000000 +0200
@@ -1,3 +1,6 @@
+{-# LANGUAGE BangPatterns #-}
+{-# LANGUAGE TupleSections #-}
+
 -- |
 -- Module      :  Control.Applicative.Combinators
 -- Copyright   :  ?? 2017???present Mark Karpov
@@ -41,45 +44,42 @@
 -- backtrack in order for the alternative branch of parsing to be tried.
 -- Thus it is the responsibility of the programmer to wrap more complex,
 -- composite parsers in @try@ to achieve correct behavior.
-
-{-# LANGUAGE BangPatterns #-}
-{-# LANGUAGE TupleSections #-}
-
 module Control.Applicative.Combinators
   ( -- * Re-exports from "Control.Applicative"
-    (<|>)
+    (<|>),
     -- $assocbo
-  , many
+    many,
     -- $many
-  , some
+    some,
     -- $some
-  , optional
+    optional,
     -- $optional
-  , empty
+    empty,
     -- $empty
 
     -- * Original combinators
-  , between
-  , choice
-  , count
-  , count'
-  , eitherP
-  , endBy
-  , endBy1
-  , manyTill
-  , manyTill_
-  , someTill
-  , someTill_
-  , option
-  , sepBy
-  , sepBy1
-  , sepEndBy
-  , sepEndBy1
-  , skipMany
-  , skipSome
-  , skipCount
-  , skipManyTill
-  , skipSomeTill )
+    between,
+    choice,
+    count,
+    count',
+    eitherP,
+    endBy,
+    endBy1,
+    manyTill,
+    manyTill_,
+    someTill,
+    someTill_,
+    option,
+    sepBy,
+    sepBy1,
+    sepEndBy,
+    sepEndBy1,
+    skipMany,
+    skipSome,
+    skipCount,
+    skipManyTill,
+    skipSomeTill,
+  )
 where
 
 import Control.Applicative
@@ -132,7 +132,6 @@
 -- Returns the value returned by @p@.
 --
 -- > braces = between (symbol "{") (symbol "}")
-
 between :: Applicative m => m open -> m close -> m a -> m a
 between open close p = open *> p <* close
 {-# INLINE between #-}
@@ -141,7 +140,6 @@
 -- until one of them succeeds. Returns the value of the succeeding parser.
 --
 -- > choice = asum
-
 choice :: (Foldable f, Alternative m) => f (m a) -> m a
 choice = asum
 {-# INLINE choice #-}
@@ -153,7 +151,6 @@
 -- > count = replicateM
 --
 -- See also: 'skipCount', 'count''.
-
 count :: Applicative m => Int -> m a -> m [a]
 count = replicateM
 {-# INLINE count #-}
@@ -166,20 +163,18 @@
 -- as if it were equal to zero.
 --
 -- See also: 'skipCount', 'count'.
-
 count' :: Alternative m => Int -> Int -> m a -> m [a]
 count' m' n' p = go m' n'
   where
     go !m !n
       | n <= 0 || m > n = pure []
-      | m > 0           = liftA2 (:) p (go (m - 1) (n - 1))
-      | otherwise       = liftA2 (:) p (go 0 (n - 1)) <|> pure []
+      | m > 0 = liftA2 (:) p (go (m - 1) (n - 1))
+      | otherwise = liftA2 (:) p (go 0 (n - 1)) <|> pure []
 {-# INLINE count' #-}
 
 -- | Combine two alternatives.
 --
 -- > eitherP a b = (Left <$> a) <|> (Right <$> b)
-
 eitherP :: Alternative m => m a -> m b -> m (Either a b)
 eitherP a b = (Left <$> a) <|> (Right <$> b)
 {-# INLINE eitherP #-}
@@ -188,14 +183,12 @@
 -- ended by @sep@. Returns a list of values returned by @p@.
 --
 -- > cStatements = cStatement `endBy` semicolon
-
 endBy :: Alternative m => m a -> m sep -> m [a]
 endBy p sep = many (p <* sep)
 {-# INLINE endBy #-}
 
 -- | @'endBy1' p sep@ parses /one/ or more occurrences of @p@, separated and
 -- ended by @sep@. Returns a list of values returned by @p@.
-
 endBy1 :: Alternative m => m a -> m sep -> m [a]
 endBy1 p sep = some (p <* sep)
 {-# INLINE endBy1 #-}
@@ -205,7 +198,6 @@
 -- is consumed and lost. Use 'manyTill_' if you wish to keep it.
 --
 -- See also: 'skipMany', 'skipManyTill'.
-
 manyTill :: Alternative m => m a -> m end -> m [a]
 manyTill p end = go
   where
@@ -220,11 +212,10 @@
 -- See also: 'skipMany', 'skipManyTill'.
 --
 -- @since 1.2.0
-
 manyTill_ :: Alternative m => m a -> m end -> m ([a], end)
 manyTill_ p end = go
   where
-    go = (([],) <$> end) <|> liftA2 (\x (xs, y) -> (x:xs, y)) p go
+    go = (([],) <$> end) <|> liftA2 (\x (xs, y) -> (x : xs, y)) p go
 {-# INLINE manyTill_ #-}
 
 -- | @'someTill' p end@ works similarly to @'manyTill' p end@, but @p@
@@ -234,7 +225,6 @@
 -- > someTill p end = liftA2 (:) p (manyTill p end)
 --
 -- See also: 'skipSome', 'skipSomeTill'.
-
 someTill :: Alternative m => m a -> m end -> m [a]
 someTill p end = liftA2 (:) p (manyTill p end)
 {-# INLINE someTill #-}
@@ -246,10 +236,9 @@
 -- See also: 'skipSome', 'skipSomeTill'.
 --
 -- @since 1.2.0
-
 someTill_ :: Alternative m => m a -> m end -> m ([a], end)
 someTill_ p end =
-  liftA2 (\x (xs, y) -> (x:xs, y)) p (manyTill_ p end)
+  liftA2 (\x (xs, y) -> (x : xs, y)) p (manyTill_ p end)
 {-# INLINE someTill_ #-}
 
 -- | @'option' x p@ tries to apply the parser @p@. If @p@ fails without
@@ -259,7 +248,6 @@
 -- > option x p = p <|> pure x
 --
 -- See also: 'optional'.
-
 option :: Alternative m => a -> m a -> m a
 option x p = p <|> pure x
 {-# INLINE option #-}
@@ -268,28 +256,24 @@
 -- @sep@. Returns a list of values returned by @p@.
 --
 -- > commaSep p = p `sepBy` comma
-
 sepBy :: Alternative m => m a -> m sep -> m [a]
 sepBy p sep = sepBy1 p sep <|> pure []
 {-# INLINE sepBy #-}
 
 -- | @'sepBy1' p sep@ parses /one/ or more occurrences of @p@, separated by
 -- @sep@. Returns a list of values returned by @p@.
-
 sepBy1 :: Alternative m => m a -> m sep -> m [a]
 sepBy1 p sep = liftA2 (:) p (many (sep *> p))
 {-# INLINE sepBy1 #-}
 
 -- | @'sepEndBy' p sep@ parses /zero/ or more occurrences of @p@, separated
 -- and optionally ended by @sep@. Returns a list of values returned by @p@.
-
 sepEndBy :: Alternative m => m a -> m sep -> m [a]
 sepEndBy p sep = sepEndBy1 p sep <|> pure []
 {-# INLINE sepEndBy #-}
 
 -- | @'sepEndBy1' p sep@ parses /one/ or more occurrences of @p@, separated
 -- and optionally ended by @sep@. Returns a list of values returned by @p@.
-
 sepEndBy1 :: Alternative m => m a -> m sep -> m [a]
 sepEndBy1 p sep = liftA2 (:) p ((sep *> sepEndBy p sep) <|> pure [])
 {-# INLINEABLE sepEndBy1 #-}
@@ -298,7 +282,6 @@
 -- its result.
 --
 -- See also: 'manyTill', 'skipManyTill'.
-
 skipMany :: Alternative m => m a -> m ()
 skipMany p = go
   where
@@ -309,21 +292,18 @@
 -- result.
 --
 -- See also: 'someTill', 'skipSomeTill'.
-
 skipSome :: Alternative m => m a -> m ()
 skipSome p = p *> skipMany p
 {-# INLINE skipSome #-}
 
 -- | @'skipCount' n p@ parses @n@ occurrences of @p@, skipping its result.
--- If @n@ is not positive, the parser equals to @'pure' []@. Returns a list
--- of @n@ values.
+-- If @n@ is not positive, the parser equals to @'pure' ()@.
 --
 -- > skipCount = replicateM_
 --
 -- See also: 'count', 'count''.
 --
 -- @since 0.3.0
-
 skipCount :: Applicative m => Int -> m a -> m ()
 skipCount = replicateM_
 {-# INLINE skipCount #-}
@@ -333,7 +313,6 @@
 -- then returned.
 --
 -- See also: 'manyTill', 'skipMany'.
-
 skipManyTill :: Alternative m => m a -> m end -> m end
 skipManyTill p end = go
   where
@@ -345,7 +324,6 @@
 -- then returned.
 --
 -- See also: 'someTill', 'skipSome'.
-
 skipSomeTill :: Alternative m => m a -> m end -> m end
 skipSomeTill p end = p *> skipManyTill p end
 {-# INLINE skipSomeTill #-}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/parser-combinators-1.2.1/Control/Applicative/Permutations.hs 
new/parser-combinators-1.3.0/Control/Applicative/Permutations.hs
--- old/parser-combinators-1.2.1/Control/Applicative/Permutations.hs    
2001-09-09 03:46:40.000000000 +0200
+++ new/parser-combinators-1.3.0/Control/Applicative/Permutations.hs    
2001-09-09 03:46:40.000000000 +0200
@@ -1,3 +1,5 @@
+{-# LANGUAGE ExistentialQuantification #-}
+
 -- |
 -- Module      :  Control.Applicative.Permutations
 -- Copyright   :  ?? 2017???present Alex Washburn
@@ -30,8 +32,8 @@
 --
 -- For example, suppose we want to parse a permutation of: an optional
 -- string of @a@'s, the character @b@ and an optional @c@. Using a standard
--- parsing library combinator @char@, this can be described using the
--- 'Applicative' instance by:
+-- parsing library combinator @char@ (e.g. 
'Text.ParserCombinators.ReadP.ReadP')
+-- this can be described using the 'Applicative' instance by:
 --
 -- > test = runPermutation $
 -- >          (,,) <$> toPermutationWithDefault ""  (some (char 'a'))
@@ -39,49 +41,56 @@
 -- >               <*> toPermutationWithDefault '_' (char 'c')
 --
 -- @since 0.2.0
-
 module Control.Applicative.Permutations
   ( -- ** Permutation type
-    Permutation
+    Permutation,
+
     -- ** Permutation evaluators
-  , runPermutation
-  , intercalateEffect
+    runPermutation,
+    intercalateEffect,
+
     -- ** Permutation constructors
-  , toPermutation
-  , toPermutationWithDefault )
+    toPermutation,
+    toPermutationWithDefault,
+  )
 where
 
 import Control.Applicative
+import Data.Function ((&))
 
 -- | An 'Applicative' wrapper-type for constructing permutation parsers.
+data Permutation m a = P !(Maybe a) [Branch m a]
 
-data Permutation m a = P !(Maybe a) (m (Permutation m a))
+data Branch m a = forall z. Branch (Permutation m (z -> a)) (m z)
 
 instance Functor m => Functor (Permutation m) where
-  fmap f (P v p) = P (f <$> v) (fmap f <$> p)
+  fmap f (P v bs) = P (f <$> v) (fmap f <$> bs)
 
-instance Alternative m => Applicative (Permutation m) where
+instance Functor p => Functor (Branch p) where
+  fmap f (Branch perm p) = Branch (fmap (f .) perm) p
+
+instance Functor m => Applicative (Permutation m) where
   pure value = P (Just value) empty
-  lhs@(P f v) <*> rhs@(P g w) = P (f <*> g) (lhsAlt <|> rhsAlt)
+  lhs@(P f v) <*> rhs@(P g w) = P (f <*> g) $ (ins2 <$> v) <> (ins1 <$> w)
     where
-      lhsAlt = (<*> rhs) <$> v
-      rhsAlt = (lhs <*>) <$> w
-  liftA2 f lhs@(P x v) rhs@(P y w) = P (liftA2 f x y) (lhsAlt <|> rhsAlt)
+      ins1 (Branch perm p) = Branch ((.) <$> lhs <*> perm) p
+      ins2 (Branch perm p) = Branch (flip <$> perm <*> rhs) p
+  liftA2 f lhs@(P x v) rhs@(P y w) = P (liftA2 f x y) $ (ins2 <$> v) <> (ins1 
<$> w)
     where
-      lhsAlt = (\p -> liftA2 f p rhs) <$> v
-      rhsAlt = liftA2 f lhs <$> w
+      ins1 (Branch perm p) = Branch (liftA2 ((.) . f) lhs perm) p
+      ins2 (Branch perm p) = Branch (liftA2 (\b g z -> f (g z) b) rhs perm) p
 
 -- | \"Unlifts\" a permutation parser into a parser to be evaluated.
-
-runPermutation
-  :: ( Alternative m
-     , Monad m)
-  => Permutation m a -- ^ Permutation specification
-  -> m a             -- ^ Resulting base monad capable of handling the 
permutation
-runPermutation (P value parser) = optional parser >>= f
-   where
-      f  Nothing = maybe empty pure value
-      f (Just p) = runPermutation p
+runPermutation ::
+  Alternative m =>
+  -- | Permutation specification
+  Permutation m a ->
+  -- | Resulting base monad capable of handling the permutation
+  m a
+runPermutation = foldAlt f
+  where
+    -- INCORRECT   = runPerms t <*> p
+    f (Branch t p) = (&) <$> p <*> runPermutation t
 
 -- | \"Unlifts\" a permutation parser into a parser to be evaluated with an
 -- intercalated effect. Useful for separators between permutation elements.
@@ -109,41 +118,48 @@
 --       permutation.
 --     * No effects are intercalated between missing components with a
 --       default value.
+--     * If an effect is encountered after a component, another component must
+--       immediately follow the effect.
+intercalateEffect ::
+  Alternative m =>
+  -- | Effect to be intercalated between permutation components
+  m b ->
+  -- | Permutation specification
+  Permutation m a ->
+  -- | Resulting base applicative capable of handling the permutation
+  m a
+intercalateEffect effect = foldAlt (runBranchEff effect)
+  where
+    runPermEff :: Alternative m => m b -> Permutation m a -> m a
+    runPermEff eff (P v bs) =
+      eff *> foldr ((<|>) . runBranchEff eff) empty bs <|> maybe empty pure v
 
-intercalateEffect
-  :: ( Alternative m
-     , Monad m)
-  => m b             -- ^ Effect to be intercalated between permutation 
components
-  -> Permutation m a -- ^ Permutation specification
-  -> m a             -- ^ Resulting base monad capable of handling the 
permutation
-intercalateEffect = run noEffect
-   where
-     noEffect = pure ()
-
-     run :: (Alternative m, Monad m) => m c -> m b -> Permutation m a -> m a
-     run headSep tailSep (P value parser) = optional headSep >>= f
-       where
-         f  Nothing = maybe empty pure value
-         f (Just _) = optional parser >>= g
-         g  Nothing = maybe empty pure value
-         g (Just p) = run tailSep tailSep p
+    runBranchEff :: Alternative m => m b -> Branch m a -> m a
+    runBranchEff eff (Branch t p) = (&) <$> p <*> runPermEff eff t
 
 -- | \"Lifts\" a parser to a permutation parser.
-
-toPermutation
-  :: Alternative m
-  => m a -- ^ Permutation component
-  -> Permutation m a
-toPermutation p = P Nothing $ pure <$> p
+toPermutation ::
+  Alternative m =>
+  -- | Permutation component
+  m a ->
+  Permutation m a
+toPermutation = P Nothing . pure . branch
 
 -- | \"Lifts\" a parser with a default value to a permutation parser.
 --
 -- If no permutation containing the supplied parser can be parsed from the 
input,
 -- then the supplied default value is returned in lieu of a parse result.
+toPermutationWithDefault ::
+  Alternative m =>
+  -- | Default Value
+  a ->
+  -- | Permutation component
+  m a ->
+  Permutation m a
+toPermutationWithDefault v = P (Just v) . pure . branch
+
+branch :: Functor m => m a -> Branch m a
+branch = Branch $ pure id
 
-toPermutationWithDefault
-  :: Alternative m
-  => a   -- ^ Default Value
-  -> m a -- ^ Permutation component
-  -> Permutation m a
-toPermutationWithDefault v p = P (Just v) $ pure <$> p
+foldAlt :: Alternative m => (Branch m a -> m a) -> Permutation m a -> m a
+foldAlt f (P v bs) = foldr ((<|>) . f) (maybe empty pure v) bs
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/parser-combinators-1.2.1/Control/Monad/Combinators/Expr.hs 
new/parser-combinators-1.3.0/Control/Monad/Combinators/Expr.hs
--- old/parser-combinators-1.2.1/Control/Monad/Combinators/Expr.hs      
2001-09-09 03:46:40.000000000 +0200
+++ new/parser-combinators-1.3.0/Control/Monad/Combinators/Expr.hs      
2001-09-09 03:46:40.000000000 +0200
@@ -11,10 +11,10 @@
 -- of operators.
 --
 -- @since 1.0.0
-
 module Control.Monad.Combinators.Expr
-  ( Operator (..)
-  , makeExprParser )
+  ( Operator (..),
+    makeExprParser,
+  )
 where
 
 import Control.Monad
@@ -23,15 +23,18 @@
 -- | This data type specifies operators that work on values of type @a@. An
 -- operator is either binary infix or unary prefix or postfix. A binary
 -- operator has also an associated associativity.
-
 data Operator m a
-  = InfixN  (m (a -> a -> a)) -- ^ Non-associative infix
-  | InfixL  (m (a -> a -> a)) -- ^ Left-associative infix
-  | InfixR  (m (a -> a -> a)) -- ^ Right-associative infix
-  | Prefix  (m (a -> a))      -- ^ Prefix
-  | Postfix (m (a -> a))      -- ^ Postfix
-  | TernR   (m (m (a -> a -> a -> a)))
-    -- ^ Right-associative ternary. Right-associative means that
+  = -- | Non-associative infix
+    InfixN (m (a -> a -> a))
+  | -- | Left-associative infix
+    InfixL (m (a -> a -> a))
+  | -- | Right-associative infix
+    InfixR (m (a -> a -> a))
+  | -- | Prefix
+    Prefix (m (a -> a))
+  | -- | Postfix
+    Postfix (m (a -> a))
+  | -- | Right-associative ternary. Right-associative means that
     -- @a ? b : d ? e : f@ parsed as
     -- @a ? b : (d ? e : f)@ and not as @(a ? b : d) ? e : f@.
     --
@@ -42,6 +45,7 @@
     -- Example usage:
     --
     -- >>> TernR ((If <$ char ':') <$ char '?')
+    TernR (m (m (a -> a -> a -> a)))
 
 -- | @'makeExprParser' term table@ builds an expression parser for terms
 -- @term@ with operators from @table@, taking the associativity and
@@ -88,37 +92,38 @@
 -- > binary  name f = InfixL  (f <$ symbol name)
 -- > prefix  name f = Prefix  (f <$ symbol name)
 -- > postfix name f = Postfix (f <$ symbol name)
-
-makeExprParser :: MonadPlus m
-  => m a               -- ^ Term parser
-  -> [[Operator m a]]  -- ^ Operator table, see 'Operator'
-  -> m a               -- ^ Resulting expression parser
+makeExprParser ::
+  MonadPlus m =>
+  -- | Term parser
+  m a ->
+  -- | Operator table, see 'Operator'
+  [[Operator m a]] ->
+  -- | Resulting expression parser
+  m a
 makeExprParser = foldl addPrecLevel
 {-# INLINEABLE makeExprParser #-}
 
 -- | @addPrecLevel p ops@ adds the ability to parse operators in table @ops@
 -- to parser @p@.
-
 addPrecLevel :: MonadPlus m => m a -> [Operator m a] -> m a
 addPrecLevel term ops =
   term' >>= \x -> choice [ras' x, las' x, nas' x, tern' x, return x]
   where
-    (ras, las, nas, prefix, postfix, tern) = foldr splitOp ([],[],[],[],[],[]) 
ops
+    (ras, las, nas, prefix, postfix, tern) = foldr splitOp ([], [], [], [], 
[], []) ops
     term' = pTerm (choice prefix) term (choice postfix)
-    ras'  = pInfixR (choice ras) term'
-    las'  = pInfixL (choice las) term'
-    nas'  = pInfixN (choice nas) term'
-    tern' = pTernR  (choice tern) term'
+    ras' = pInfixR (choice ras) term'
+    las' = pInfixL (choice las) term'
+    nas' = pInfixN (choice nas) term'
+    tern' = pTernR (choice tern) term'
 {-# INLINEABLE addPrecLevel #-}
 
 -- | @pTerm prefix term postfix@ parses a @term@ surrounded by optional
 -- prefix and postfix unary operators. Parsers @prefix@ and @postfix@ are
 -- allowed to fail, in this case 'id' is used.
-
 pTerm :: MonadPlus m => m (a -> a) -> m a -> m (a -> a) -> m a
 pTerm prefix term postfix = do
-  pre  <- option id prefix
-  x    <- term
+  pre <- option id prefix
+  x <- term
   post <- option id postfix
   return . post . pre $ x
 {-# INLINE pTerm #-}
@@ -126,7 +131,6 @@
 -- | @pInfixN op p x@ parses non-associative infix operator @op@, then term
 -- with parser @p@, then returns result of the operator application on @x@
 -- and the term.
-
 pInfixN :: MonadPlus m => m (a -> a -> a) -> m a -> a -> m a
 pInfixN op p x = do
   f <- op
@@ -137,7 +141,6 @@
 -- | @pInfixL op p x@ parses left-associative infix operator @op@, then term
 -- with parser @p@, then returns result of the operator application on @x@
 -- and the term.
-
 pInfixL :: MonadPlus m => m (a -> a -> a) -> m a -> a -> m a
 pInfixL op p x = do
   f <- op
@@ -149,7 +152,6 @@
 -- | @pInfixR op p x@ parses right-associative infix operator @op@, then
 -- term with parser @p@, then returns result of the operator application on
 -- @x@ and the term.
-
 pInfixR :: MonadPlus m => m (a -> a -> a) -> m a -> a -> m a
 pInfixR op p x = do
   f <- op
@@ -158,7 +160,6 @@
 {-# INLINE pInfixR #-}
 
 -- | Parse the first separator of a ternary operator
-
 pTernR :: MonadPlus m => m (m (a -> a -> a -> a)) -> m a -> a -> m a
 pTernR sep1 p x = do
   sep2 <- sep1
@@ -169,21 +170,20 @@
 {-# INLINE pTernR #-}
 
 type Batch m a =
-  ( [m (a -> a -> a)]
-  , [m (a -> a -> a)]
-  , [m (a -> a -> a)]
-  , [m (a -> a)]
-  , [m (a -> a)]
-  , [m (m (a -> a -> a -> a))]
+  ( [m (a -> a -> a)],
+    [m (a -> a -> a)],
+    [m (a -> a -> a)],
+    [m (a -> a)],
+    [m (a -> a)],
+    [m (m (a -> a -> a -> a))]
   )
 
 -- | A helper to separate various operators (binary, unary, and according to
 -- associativity) and return them in a tuple.
-
 splitOp :: Operator m a -> Batch m a -> Batch m a
-splitOp (InfixR  op) (r, l, n, pre, post, tern) = (op:r, l, n, pre, post, tern)
-splitOp (InfixL  op) (r, l, n, pre, post, tern) = (r, op:l, n, pre, post, tern)
-splitOp (InfixN  op) (r, l, n, pre, post, tern) = (r, l, op:n, pre, post, tern)
-splitOp (Prefix  op) (r, l, n, pre, post, tern) = (r, l, n, op:pre, post, tern)
-splitOp (Postfix op) (r, l, n, pre, post, tern) = (r, l, n, pre, op:post, tern)
-splitOp (TernR   op) (r, l, n, pre, post, tern) = (r, l, n, pre, post, op:tern)
+splitOp (InfixR op) (r, l, n, pre, post, tern) = (op : r, l, n, pre, post, 
tern)
+splitOp (InfixL op) (r, l, n, pre, post, tern) = (r, op : l, n, pre, post, 
tern)
+splitOp (InfixN op) (r, l, n, pre, post, tern) = (r, l, op : n, pre, post, 
tern)
+splitOp (Prefix op) (r, l, n, pre, post, tern) = (r, l, n, op : pre, post, 
tern)
+splitOp (Postfix op) (r, l, n, pre, post, tern) = (r, l, n, pre, op : post, 
tern)
+splitOp (TernR op) (r, l, n, pre, post, tern) = (r, l, n, pre, post, op : tern)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/parser-combinators-1.2.1/Control/Monad/Combinators/NonEmpty.hs 
new/parser-combinators-1.3.0/Control/Monad/Combinators/NonEmpty.hs
--- old/parser-combinators-1.2.1/Control/Monad/Combinators/NonEmpty.hs  
2001-09-09 03:46:40.000000000 +0200
+++ new/parser-combinators-1.3.0/Control/Monad/Combinators/NonEmpty.hs  
2001-09-09 03:46:40.000000000 +0200
@@ -11,32 +11,30 @@
 -- from "Control.Monad.Combinators".
 --
 -- @since 0.4.0
-
 module Control.Monad.Combinators.NonEmpty
-  ( some
-  , endBy1
-  , someTill
-  , sepBy1
-  , sepEndBy1 )
+  ( some,
+    endBy1,
+    someTill,
+    sepBy1,
+    sepEndBy1,
+  )
 where
 
 import Control.Monad
-import Data.List.NonEmpty (NonEmpty (..))
 import qualified Control.Monad.Combinators as C
-import qualified Data.List.NonEmpty        as NE
+import Data.List.NonEmpty (NonEmpty (..))
+import qualified Data.List.NonEmpty as NE
 
 -- | @'some' p@ applies the parser @p@ /one/ or more times and returns a
 -- list of the values returned by @p@.
 --
 -- > word = some letter
-
 some :: MonadPlus m => m a -> m (NonEmpty a)
 some p = NE.fromList <$> C.some p
 {-# INLINE some #-}
 
 -- | @'endBy1' p sep@ parses /one/ or more occurrences of @p@, separated and
 -- ended by @sep@. Returns a non-empty list of values returned by @p@.
-
 endBy1 :: MonadPlus m => m a -> m sep -> m (NonEmpty a)
 endBy1 p sep = NE.fromList <$> C.endBy1 p sep
 {-# INLINE endBy1 #-}
@@ -45,14 +43,12 @@
 -- should succeed at least once.
 --
 -- See also: 'C.skipSome', 'C.skipSomeTill'.
-
 someTill :: MonadPlus m => m a -> m end -> m (NonEmpty a)
 someTill p end = NE.fromList <$> C.someTill p end
 {-# INLINE someTill #-}
 
 -- | @'sepBy1' p sep@ parses /one/ or more occurrences of @p@, separated by
 -- @sep@. Returns a non-empty list of values returned by @p@.
-
 sepBy1 :: MonadPlus m => m a -> m sep -> m (NonEmpty a)
 sepBy1 p sep = NE.fromList <$> C.sepBy1 p sep
 {-# INLINE sepBy1 #-}
@@ -60,7 +56,6 @@
 -- | @'sepEndBy1' p sep@ parses /one/ or more occurrences of @p@, separated
 -- and optionally ended by @sep@. Returns a non-empty list of values returned 
by
 -- @p@.
-
 sepEndBy1 :: MonadPlus m => m a -> m sep -> m (NonEmpty a)
 sepEndBy1 p sep = NE.fromList <$> C.sepEndBy1 p sep
 {-# INLINE sepEndBy1 #-}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/parser-combinators-1.2.1/Control/Monad/Combinators.hs 
new/parser-combinators-1.3.0/Control/Monad/Combinators.hs
--- old/parser-combinators-1.2.1/Control/Monad/Combinators.hs   2001-09-09 
03:46:40.000000000 +0200
+++ new/parser-combinators-1.3.0/Control/Monad/Combinators.hs   2001-09-09 
03:46:40.000000000 +0200
@@ -1,3 +1,5 @@
+{-# LANGUAGE BangPatterns #-}
+
 -- |
 -- Module      :  Control.Monad.Combinators
 -- Copyright   :  ?? 2017???present Mark Karpov
@@ -15,46 +17,44 @@
 -- "Control.Applicative.Combinators".
 --
 -- @since 0.4.0
-
-{-# LANGUAGE BangPatterns #-}
-
 module Control.Monad.Combinators
   ( -- * Re-exports from "Control.Applicative"
-    (C.<|>)
+    (C.<|>),
     -- $assocbo
-  , C.optional
+    C.optional,
     -- $optional
-  , C.empty
+    C.empty,
     -- $empty
 
     -- * Original combinators
-  , C.between
-  , C.choice
-  , count
-  , count'
-  , C.eitherP
-  , endBy
-  , endBy1
-  , many
-  , manyTill
-  , manyTill_
-  , some
-  , someTill
-  , someTill_
-  , C.option
-  , sepBy
-  , sepBy1
-  , sepEndBy
-  , sepEndBy1
-  , skipMany
-  , skipSome
-  , skipCount
-  , skipManyTill
-  , skipSomeTill )
+    C.between,
+    C.choice,
+    count,
+    count',
+    C.eitherP,
+    endBy,
+    endBy1,
+    many,
+    manyTill,
+    manyTill_,
+    some,
+    someTill,
+    someTill_,
+    C.option,
+    sepBy,
+    sepBy1,
+    sepEndBy,
+    sepEndBy1,
+    skipMany,
+    skipSome,
+    skipCount,
+    skipManyTill,
+    skipSomeTill,
+  )
 where
 
-import Control.Monad
 import qualified Control.Applicative.Combinators as C
+import Control.Monad
 
 ----------------------------------------------------------------------------
 -- Re-exports from "Control.Applicative"
@@ -87,7 +87,6 @@
 -- values.
 --
 -- See also: 'skipCount', 'count''.
-
 count :: Monad m => Int -> m a -> m [a]
 count n' p = go id n'
   where
@@ -96,7 +95,7 @@
         then return (f [])
         else do
           x <- p
-          go (f . (x:)) (n - 1)
+          go (f . (x :)) (n - 1)
 {-# INLINE count #-}
 
 -- | @'count'' m n p@ parses from @m@ to @n@ occurrences of @p@. If @n@ is
@@ -107,7 +106,6 @@
 -- as if it were equal to zero.
 --
 -- See also: 'skipCount', 'count'.
-
 count' :: MonadPlus m => Int -> Int -> m a -> m [a]
 count' m' n' p =
   if n' > 0 && n' >= m'
@@ -118,7 +116,7 @@
       if m > 0
         then do
           x <- p
-          gom (f . (x:)) (m - 1)
+          gom (f . (x :)) (m - 1)
         else god f (if m' <= 0 then n' else n' - m')
     god f !d =
       if d > 0
@@ -126,7 +124,7 @@
           r <- C.optional p
           case r of
             Nothing -> return (f [])
-            Just  x -> god (f . (x:)) (d - 1)
+            Just x -> god (f . (x :)) (d - 1)
         else return (f [])
 {-# INLINE count' #-}
 
@@ -134,14 +132,12 @@
 -- ended by @sep@. Returns a list of values returned by @p@.
 --
 -- > cStatements = cStatement `endBy` semicolon
-
 endBy :: MonadPlus m => m a -> m sep -> m [a]
 endBy p sep = many (p >>= \x -> x <$ sep)
 {-# INLINE endBy #-}
 
 -- | @'endBy1' p sep@ parses /one/ or more occurrences of @p@, separated and
 -- ended by @sep@. Returns a list of values returned by @p@.
-
 endBy1 :: MonadPlus m => m a -> m sep -> m [a]
 endBy1 p sep = some (p >>= \x -> x <$ sep)
 {-# INLINE endBy1 #-}
@@ -150,7 +146,6 @@
 -- list of the values returned by @p@.
 --
 -- > identifier = (:) <$> letter <*> many (alphaNumChar <|> char '_')
-
 many :: MonadPlus m => m a -> m [a]
 many p = go id
   where
@@ -158,7 +153,7 @@
       r <- C.optional p
       case r of
         Nothing -> return (f [])
-        Just  x -> go (f . (x:))
+        Just x -> go (f . (x :))
 {-# INLINE many #-}
 
 -- | @'manyTill' p end@ applies parser @p@ /zero/ or more times until parser
@@ -167,7 +162,6 @@
 -- it.
 --
 -- See also: 'skipMany', 'skipManyTill'.
-
 manyTill :: MonadPlus m => m a -> m end -> m [a]
 manyTill p end = fst <$> manyTill_ p end
 {-# INLINE manyTill #-}
@@ -180,7 +174,6 @@
 -- See also: 'skipMany', 'skipManyTill'.
 --
 -- @since 1.2.0
-
 manyTill_ :: MonadPlus m => m a -> m end -> m ([a], end)
 manyTill_ p end = go id
   where
@@ -188,16 +181,15 @@
       done <- C.optional end
       case done of
         Just done' -> return (f [], done')
-        Nothing  -> do
+        Nothing -> do
           x <- p
-          go (f . (x:))
+          go (f . (x :))
 {-# INLINE manyTill_ #-}
 
 -- | @'some' p@ applies the parser @p@ /one/ or more times and returns a
 -- list of the values returned by @p@.
 --
 -- > word = some letter
-
 some :: MonadPlus m => m a -> m [a]
 some p = liftM2 (:) p (many p)
 {-# INLINE some #-}
@@ -209,7 +201,6 @@
 -- > someTill p end = liftM2 (:) p (manyTill p end)
 --
 -- See also: 'skipSome', 'skipSomeTill'.
-
 someTill :: MonadPlus m => m a -> m end -> m [a]
 someTill p end = liftM2 (:) p (manyTill p end)
 {-# INLINE someTill #-}
@@ -221,36 +212,32 @@
 -- See also: 'skipSome', 'skipSomeTill'.
 --
 -- @since 1.2.0
-
 someTill_ :: MonadPlus m => m a -> m end -> m ([a], end)
-someTill_ p end = liftM2 (\x (xs, y) -> (x:xs, y)) p (manyTill_ p end)
+someTill_ p end = liftM2 (\x (xs, y) -> (x : xs, y)) p (manyTill_ p end)
 {-# INLINE someTill_ #-}
 
 -- | @'sepBy' p sep@ parses /zero/ or more occurrences of @p@, separated by
 -- @sep@. Returns a list of values returned by @p@.
 --
 -- > commaSep p = p `sepBy` comma
-
 sepBy :: MonadPlus m => m a -> m sep -> m [a]
 sepBy p sep = do
   r <- C.optional p
   case r of
     Nothing -> return []
-    Just  x -> (x:) <$> many (sep >> p)
+    Just x -> (x :) <$> many (sep >> p)
 {-# INLINE sepBy #-}
 
 -- | @'sepBy1' p sep@ parses /one/ or more occurrences of @p@, separated by
 -- @sep@. Returns a list of values returned by @p@.
-
 sepBy1 :: MonadPlus m => m a -> m sep -> m [a]
 sepBy1 p sep = do
   x <- p
-  (x:) <$> many (sep >> p)
+  (x :) <$> many (sep >> p)
 {-# INLINE sepBy1 #-}
 
 -- | @'sepEndBy' p sep@ parses /zero/ or more occurrences of @p@, separated
 -- and optionally ended by @sep@. Returns a list of values returned by @p@.
-
 sepEndBy :: MonadPlus m => m a -> m sep -> m [a]
 sepEndBy p sep = go id
   where
@@ -258,22 +245,21 @@
       r <- C.optional p
       case r of
         Nothing -> return (f [])
-        Just  x -> do
+        Just x -> do
           more <- C.option False (True <$ sep)
           if more
-            then go (f . (x:))
+            then go (f . (x :))
             else return (f [x])
 {-# INLINE sepEndBy #-}
 
 -- | @'sepEndBy1' p sep@ parses /one/ or more occurrences of @p@, separated
 -- and optionally ended by @sep@. Returns a list of values returned by @p@.
-
 sepEndBy1 :: MonadPlus m => m a -> m sep -> m [a]
 sepEndBy1 p sep = do
   x <- p
   more <- C.option False (True <$ sep)
   if more
-    then (x:) <$> sepEndBy p sep
+    then (x :) <$> sepEndBy p sep
     else return [x]
 {-# INLINE sepEndBy1 #-}
 
@@ -281,7 +267,6 @@
 -- its result.
 --
 -- See also: 'manyTill', 'skipManyTill'.
-
 skipMany :: MonadPlus m => m a -> m ()
 skipMany p = go
   where
@@ -294,17 +279,14 @@
 -- result.
 --
 -- See also: 'someTill', 'skipSomeTill'.
-
 skipSome :: MonadPlus m => m a -> m ()
 skipSome p = p >> skipMany p
 {-# INLINE skipSome #-}
 
 -- | @'skipCount' n p@ parses @n@ occurrences of @p@, skipping its result.
--- If @n@ is smaller or equal to zero, the parser equals to @'return' []@.
--- Returns a list of @n@ values.
+-- If @n@ is smaller or equal to zero, the parser equals to @'return' ()@.
 --
 -- See also: 'count', 'count''.
-
 skipCount :: Monad m => Int -> m a -> m ()
 skipCount n' p = go n'
   where
@@ -318,7 +300,6 @@
 -- then returned.
 --
 -- See also: 'manyTill', 'skipMany'.
-
 skipManyTill :: MonadPlus m => m a -> m end -> m end
 skipManyTill p end = go
   where
@@ -326,7 +307,7 @@
       r <- C.optional end
       case r of
         Nothing -> p >> go
-        Just  x -> return x
+        Just x -> return x
 {-# INLINE skipManyTill #-}
 
 -- | @'skipSomeTill' p end@ applies the parser @p@ /one/ or more times
@@ -334,7 +315,6 @@
 -- then returned.
 --
 -- See also: 'someTill', 'skipSome'.
-
 skipSomeTill :: MonadPlus m => m a -> m end -> m end
 skipSomeTill p end = p >> skipManyTill p end
 {-# INLINE skipSomeTill #-}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/parser-combinators-1.2.1/Control/Monad/Permutations.hs 
new/parser-combinators-1.3.0/Control/Monad/Permutations.hs
--- old/parser-combinators-1.2.1/Control/Monad/Permutations.hs  1970-01-01 
01:00:00.000000000 +0100
+++ new/parser-combinators-1.3.0/Control/Monad/Permutations.hs  2001-09-09 
03:46:40.000000000 +0200
@@ -0,0 +1,104 @@
+-- |
+-- Module      :  Control.Monad.Permutations
+-- Copyright   :  ?? 2017???present Alex Washburn
+-- License     :  BSD 3 clause
+--
+-- Maintainer  :  Mark Karpov <[email protected]>
+-- Stability   :  experimental
+-- Portability :  portable
+--
+-- This module specialized the interface to 'Monad' for potential efficiency
+-- considerations, depending on the monad the permutations are run over.
+--
+-- For a more general interface requiring only 'Applicative', and for more
+-- complete documentation, see the 'Control.Applicative.Permutations' module.
+--
+-- @since 1.3.0
+module Control.Monad.Permutations
+  ( -- ** Permutation type
+    Permutation,
+
+    -- ** Permutation evaluators
+    runPermutation,
+    intercalateEffect,
+
+    -- ** Permutation constructors
+    toPermutation,
+    toPermutationWithDefault,
+  )
+where
+
+import Control.Applicative
+
+-- | An 'Applicative' wrapper-type for constructing permutation parsers.
+data Permutation m a = P !(Maybe a) (m (Permutation m a))
+
+instance Functor m => Functor (Permutation m) where
+  fmap f (P v p) = P (f <$> v) (fmap f <$> p)
+
+instance Alternative m => Applicative (Permutation m) where
+  pure value = P (Just value) empty
+  lhs@(P f v) <*> rhs@(P g w) = P (f <*> g) (lhsAlt <|> rhsAlt)
+    where
+      lhsAlt = (<*> rhs) <$> v
+      rhsAlt = (lhs <*>) <$> w
+  liftA2 f lhs@(P x v) rhs@(P y w) = P (liftA2 f x y) (lhsAlt <|> rhsAlt)
+    where
+      lhsAlt = (\p -> liftA2 f p rhs) <$> v
+      rhsAlt = liftA2 f lhs <$> w
+
+-- | \"Unlifts\" a permutation parser into a parser to be evaluated.
+runPermutation ::
+  ( Alternative m,
+    Monad m
+  ) =>
+  -- | Permutation specification
+  Permutation m a ->
+  -- | Resulting base monad capable of handling the permutation
+  m a
+runPermutation (P value parser) = optional parser >>= f
+  where
+    f Nothing = maybe empty pure value
+    f (Just p) = runPermutation p
+
+-- | \"Unlifts\" a permutation parser into a parser to be evaluated with an
+-- intercalated effect. Useful for separators between permutation elements.
+intercalateEffect ::
+  ( Alternative m,
+    Monad m
+  ) =>
+  -- | Effect to be intercalated between permutation components
+  m b ->
+  -- | Permutation specification
+  Permutation m a ->
+  -- | Resulting base monad capable of handling the permutation
+  m a
+intercalateEffect = run noEffect
+  where
+    noEffect = pure ()
+    run :: (Alternative m, Monad m) => m c -> m b -> Permutation m a -> m a
+    run headSep tailSep (P value parser) = optional (headSep *> parser) >>= f
+      where
+        f Nothing = maybe empty pure value
+        f (Just p) = run tailSep tailSep p
+
+-- | \"Lifts\" a parser to a permutation parser.
+toPermutation ::
+  Alternative m =>
+  -- | Permutation component
+  m a ->
+  Permutation m a
+toPermutation p = P Nothing $ pure <$> p
+
+-- | \"Lifts\" a parser with a default value to a permutation parser.
+--
+-- If no permutation containing the supplied parser can be parsed from the 
input,
+-- then the supplied default value is returned in lieu of a parse result.
+toPermutationWithDefault ::
+  Alternative m =>
+  -- | Default Value
+  a ->
+  -- | Permutation component
+  m a ->
+  Permutation m a
+toPermutationWithDefault v p = P (Just v) $ pure <$> p
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/parser-combinators-1.2.1/README.md 
new/parser-combinators-1.3.0/README.md
--- old/parser-combinators-1.2.1/README.md      2001-09-09 03:46:40.000000000 
+0200
+++ new/parser-combinators-1.3.0/README.md      2001-09-09 03:46:40.000000000 
+0200
@@ -4,7 +4,7 @@
 
[![Hackage](https://img.shields.io/hackage/v/parser-combinators.svg?style=flat)](https://hackage.haskell.org/package/parser-combinators)
 [![Stackage 
Nightly](http://stackage.org/package/parser-combinators/badge/nightly)](http://stackage.org/nightly/package/parser-combinators)
 [![Stackage 
LTS](http://stackage.org/package/parser-combinators/badge/lts)](http://stackage.org/lts/package/parser-combinators)
-[![Build 
Status](https://travis-ci.org/mrkkrp/parser-combinators.svg?branch=master)](https://travis-ci.org/mrkkrp/parser-combinators)
+![CI](https://github.com/mrkkrp/parser-combinators/workflows/CI/badge.svg?branch=master)
 
 The package provides common parser combinators defined in terms of
 `Applicative` and `Alternative` without any dependencies but `base`. There
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/parser-combinators-1.2.1/parser-combinators.cabal 
new/parser-combinators-1.3.0/parser-combinators.cabal
--- old/parser-combinators-1.2.1/parser-combinators.cabal       2001-09-09 
03:46:40.000000000 +0200
+++ new/parser-combinators-1.3.0/parser-combinators.cabal       2001-09-09 
03:46:40.000000000 +0200
@@ -1,45 +1,57 @@
-name:                 parser-combinators
-version:              1.2.1
-cabal-version:        1.18
-tested-with:          GHC==8.4.4, GHC==8.6.5, GHC==8.8.1
-license:              BSD3
-license-file:         LICENSE.md
-author:               Mark Karpov <[email protected]>
-                      Alex Washburn <[email protected]>
-maintainer:           Mark Karpov <[email protected]>
-homepage:             https://github.com/mrkkrp/parser-combinators
-bug-reports:          https://github.com/mrkkrp/parser-combinators/issues
-category:             Parsing
-synopsis:             Lightweight package providing commonly useful parser 
combinators
-build-type:           Simple
-description:          Lightweight package providing commonly useful parser 
combinators.
-extra-doc-files:      CHANGELOG.md
-                    , README.md
+cabal-version:   1.18
+name:            parser-combinators
+version:         1.3.0
+license:         BSD3
+license-file:    LICENSE.md
+maintainer:      Mark Karpov <[email protected]>
+author:
+    Mark Karpov <[email protected]>
+    Alex Washburn <[email protected]>
+
+tested-with:     ghc ==8.6.5 ghc ==8.8.4 ghc ==8.10.3
+homepage:        https://github.com/mrkkrp/parser-combinators
+bug-reports:     https://github.com/mrkkrp/parser-combinators/issues
+synopsis:
+    Lightweight package providing commonly useful parser combinators
+
+description:
+    Lightweight package providing commonly useful parser combinators.
+
+category:        Parsing
+build-type:      Simple
+extra-doc-files:
+    CHANGELOG.md
+    README.md
 
 source-repository head
-  type:               git
-  location:           https://github.com/mrkkrp/parser-combinators.git
+    type:     git
+    location: https://github.com/mrkkrp/parser-combinators.git
 
 flag dev
-  description:        Turn on development settings.
-  manual:             True
-  default:            False
+    description: Turn on development settings.
+    default:     False
+    manual:      True
 
 library
-  build-depends:      base             >= 4.11 && < 5.0
-  exposed-modules:    Control.Applicative.Combinators
-                    , Control.Applicative.Combinators.NonEmpty
-                    , Control.Applicative.Permutations
-                    , Control.Monad.Combinators
-                    , Control.Monad.Combinators.Expr
-                    , Control.Monad.Combinators.NonEmpty
-  if flag(dev)
-    ghc-options:      -Wall -Werror
-  else
-    ghc-options:      -O2 -Wall
-  if flag(dev)
-    ghc-options:      -Wcompat
-                      -Wincomplete-record-updates
-                      -Wincomplete-uni-patterns
-                      -Wnoncanonical-monad-instances
-  default-language:   Haskell2010
+    exposed-modules:
+        Control.Applicative.Combinators
+        Control.Applicative.Combinators.NonEmpty
+        Control.Applicative.Permutations
+        Control.Monad.Combinators
+        Control.Monad.Combinators.Expr
+        Control.Monad.Combinators.NonEmpty
+        Control.Monad.Permutations
+
+    default-language: Haskell2010
+    build-depends:    base >=4.12 && <5.0
+
+    if flag(dev)
+        ghc-options: -Wall -Werror
+
+    else
+        ghc-options: -O2 -Wall
+
+    if flag(dev)
+        ghc-options:
+            -Wcompat -Wincomplete-record-updates -Wincomplete-uni-patterns
+            -Wnoncanonical-monad-instances

Reply via email to