regex-examples 0.5.0.0 → 0.6.0.0
raw patch · 13 files changed
+125/−104 lines, 13 filesdep +regex-with-pcredep ~regex
Dependencies added: regex-with-pcre
Dependency ranges changed: regex
Files
- README.markdown +2/−0
- changelog +3/−0
- examples/re-gen-cabals.lhs +30/−16
- examples/re-tests.lhs +8/−8
- examples/re-tutorial.lhs +4/−4
- lib/cabal-masters/constraints-incl.cabal +1/−0
- lib/cabal-masters/executables-incl.cabal +2/−2
- lib/cabal-masters/mega-regex.cabal +1/−0
- lib/cabal-masters/regex-examples.cabal +1/−1
- lib/cabal-masters/regex.cabal +33/−37
- lib/mega-regex.cabal +17/−17
- lib/version.txt +1/−1
- regex-examples.cabal +22/−18
README.markdown view
@@ -51,6 +51,8 @@ ☒ 2017-03-05 v0.5.0.0 [Ready for review: API, tutorials and examples finalized](https://github.com/iconnect/regex/milestone/6) + ☒ 2017-13-05 v0.6.0.0 [Split out PCRE](https://github.com/iconnect/regex/milestone/7)+ ☐ 2017-03-20 v1.0.0.0 [First stable release](https://github.com/iconnect/regex/milestone/3) ☐ 2017-08-31 v2.0.0.0 [Fast text replacement with benchmarks](https://github.com/iconnect/regex/milestone/4)
changelog view
@@ -1,5 +1,8 @@ -*-change-log-*- +0.6.0.0 Chris Dornan <chris.dornan@irisconnect.co.uk> 2017-03-13+ * Split out rexex-with-pcre package (#65)+ 0.5.0.0 Chris Dornan <chris.dornan@irisconnect.co.uk> 2017-03-05 * Fix inter-operation of =~ & =~~ and named captures (#55) * Add escaping functions (#37)
examples/re-gen-cabals.lhs view
@@ -50,9 +50,10 @@ ["bump-version",vrn] -> bumpVersion vrn ["sdist"] -> sdist ["gen"] -> do- gen "lib/cabal-masters/mega-regex.cabal" "lib/mega-regex.cabal"- gen "lib/cabal-masters/regex.cabal" "lib/regex.cabal"- gen "lib/cabal-masters/regex-examples.cabal" "lib/regex-examples.cabal"+ gen "lib/cabal-masters/mega-regex.cabal" "lib/mega-regex.cabal"+ gen "lib/cabal-masters/regex.cabal" "lib/regex.cabal"+ gen "lib/cabal-masters/regex-with-pcre.cabal" "lib/regex-with-pcre.cabal"+ gen "lib/cabal-masters/regex-examples.cabal" "lib/regex-examples.cabal" establish "mega-regex" "regex" _ -> do let prg = ((" "++pn++" ")++)@@ -85,6 +86,7 @@ data Ctx = Ctx { _ctx_w_error :: IORef Bool+ , _ctx_filter_pcre :: IORef Bool , _ctx_package_constraints :: IORef (Map.Map LBS.ByteString LBS.ByteString) , _ctx_test_exe :: IORef (Maybe TestExe) }@@ -99,12 +101,13 @@ deriving (Show) setup :: IO Ctx-setup = Ctx <$> (newIORef True) <*> (newIORef Map.empty) <*> (newIORef Nothing)+setup = Ctx <$> (newIORef True) <*> (newIORef False) <*> (newIORef Map.empty) <*> (newIORef Nothing) gc_script :: Ctx -> SedScript RE gc_script ctx = Select [ (,) [re|^%Werror$|] $ LineEdit $ w_error_gen ctx , (,) [re|^%Wwarn$|] $ LineEdit $ w_warn_gen ctx+ , (,) [re|^%filter-regex-with-pcre$|] $ LineEdit $ w_filter_pcre ctx , (,) [re|^%- +${pkg}(@{%id-}) +${cond}(.*)$|] $ LineEdit $ cond_gen ctx , (,) [re|^%build-depends +${list}(@{%id-}( +@{%id-})+)$|] $ LineEdit $ build_depends_gen ctx , (,) [re|^%test +${i}(@{%id-})$|] $ LineEdit $ test_exe_gen True False ctx@@ -113,14 +116,15 @@ , (,) [re|^.*$|] $ LineEdit $ default_gen ctx ] -w_error_gen, w_warn_gen, cond_gen, build_depends_gen,+w_error_gen, w_warn_gen, w_filter_pcre, cond_gen, build_depends_gen, default_gen :: Ctx -> LineNo -> Matches LBS.ByteString -> IO (LineEdit LBS.ByteString) -w_error_gen Ctx{..} _ _ = writeIORef _ctx_w_error True >> return Delete-w_warn_gen Ctx{..} _ _ = writeIORef _ctx_w_error False >> return Delete+w_error_gen Ctx{..} _ _ = writeIORef _ctx_w_error True >> return Delete+w_warn_gen Ctx{..} _ _ = writeIORef _ctx_w_error False >> return Delete+w_filter_pcre Ctx{..} _ _ = writeIORef _ctx_filter_pcre True >> return Delete cond_gen Ctx{..} _ mtchs = do modifyIORef _ctx_package_constraints $ Map.insert pkg cond@@ -133,8 +137,9 @@ build_depends_gen ctx@Ctx{..} _ mtchs = do we <- readIORef _ctx_w_error+ fp <- readIORef _ctx_filter_pcre mp <- readIORef _ctx_package_constraints- put ctx $ mk_build_depends we mp lst+ put ctx $ mk_build_depends we fp mp lst where lst = LBS.words $ captureText [cp|list|] mtch mtch = allMatches mtchs !! 0@@ -200,10 +205,11 @@ False -> LBS.unpack $ _te_name te mk_build_depends :: Bool+ -> Bool -> Map.Map LBS.ByteString LBS.ByteString -> [LBS.ByteString] -> LBS.ByteString-mk_build_depends we mp pks = LBS.unlines $+mk_build_depends we fp mp pks0 = LBS.unlines $ [ " Default-Language: Haskell2010" , " GHC-Options:" , " -Wall"@@ -217,6 +223,10 @@ True -> "-Werror" False -> "-Wwarn" + pks = case fp of+ False -> pks0+ True -> filter (/= "regex-with-pcre") pks0+ fmt (isf,pk) = LBS.pack $ printf " %c %-20s %s" (if isf then ' ' else ',')@@ -227,7 +237,11 @@ (True ,True ) -> EQ (True ,False) -> LT (False,True ) -> GT- (False,False) -> compare x y+ (False,False) -> case (x=="regex-with-pcre",y=="regex-with-pcre") of+ (True ,True ) -> EQ+ (True ,False) -> LT+ (False,True ) -> GT+ (False,False) -> compare x y adjust_le :: (LBS.ByteString->LBS.ByteString) -> LineEdit LBS.ByteString@@ -241,8 +255,9 @@ \begin{code} sdist :: IO () sdist = do- sdist' "regex"- sdist' "regex-examples"+ sdist' "regex" "lib/README-regex.md"+ sdist' "regex-with-pcre" "lib/README-regex.md"+ sdist' "regex-examples" "lib/README-regex-examples.md" establish "mega-regex" "regex" vrn_t <- T.pack . presentVrn <$> readCurrentVersion smy_t <- summary@@ -251,8 +266,8 @@ SH.run_ "git" ["commit","-m",vrn_t<>": "<>smy_t] SH.run_ "git" ["tag",vrn_t,"-m",smy_t] -sdist' :: T.Text -> IO ()-sdist' nm = do+sdist' :: T.Text -> SH.FilePath -> IO ()+sdist' nm readme = do establish nm nm SH.shelly $ SH.verbosely $ do SH.cp readme "README.markdown"@@ -260,8 +275,6 @@ (pth,tb) <- analyse_so <$> SH.lastStderr SH.cp (SH.fromText $ pth) $ SH.fromText $ "releases/"<>tb where- readme = SH.fromText $ "lib/README-"<>nm<>".md"- analyse_so so = (mtch!$$[cp|pth|],mtch!$$[cp|tb|]) where mtch = so T.?=~@@ -270,6 +283,7 @@ establish :: T.Text -> T.Text -> IO () establish nm nm' = SH.shelly $ SH.verbosely $ do SH.rm_f "mega-regex.cabal"+ SH.rm_f "regex-with-pcre.cabal" SH.rm_f "regex.cabal" SH.rm_f "regex-examples.cabal" SH.cp (SH.fromText sf) (SH.fromText df)
examples/re-tests.lhs view
@@ -88,8 +88,8 @@ -- | check that our self-testing macro environments are good prelude_tests :: TestTree prelude_tests = testGroup "Prelude"- [ tc TDFA TDFA.preludeEnv- , tc PCRE PCRE.preludeEnv+ [ tc TDFA.regexType TDFA.preludeEnv+ , tc PCRE.regexType PCRE.preludeEnv ] where tc rty m_env =@@ -553,7 +553,7 @@ -- because HPC can't measure our testing of [re|..|] forms, -- we are eliminating them from our enquiries , testGroup "RE"- [ valid_res TDFA+ [ valid_res TDFA.regexType [ TDFA.re , TDFA.reMS , TDFA.reMI@@ -565,7 +565,7 @@ , TDFA.reBlockInsensitive , TDFA.re_ ]- , testCase "TDFA.regexType" $ TDFA @=? TDFA.regexType+ , testCase "TDFA.regexType" $ assertBool "TDFA" $ isTDFA TDFA.regexType , testCase "TDFA.reOptions" $ assert_empty_macs $ optionsMacs (TDFA.reOptions tdfa_re) , testCase "TDFA.makeOptions md" $ assert_empty_macs $ optionsMacs tdfa_opts , testCase "TDFA.preludeTestsFailing" $ [] @=? TDFA.preludeTestsFailing@@ -581,7 +581,7 @@ ] -- because HPC can't measure our testing of [re|..|] forms, -- we are eliminating them from our enquiries- , valid_res PCRE+ , valid_res PCRE.regexType [ PCRE.re , PCRE.reMS , PCRE.reMI@@ -593,7 +593,7 @@ , PCRE.reBlockInsensitive , PCRE.re_ ]- , testCase "PCRE.regexType" $ PCRE @=? PCRE.regexType+ , testCase "PCRE.regexType" $ assertBool "PCRE" $ isPCRE PCRE.regexType , testCase "PCRE.reOptions" $ assert_empty_macs $ optionsMacs (PCRE.reOptions pcre_re) , testCase "PCRE.makeOptions md" $ assert_empty_macs $ optionsMacs pcre_opts , testCase "PCRE.preludeTestsFailing" $ [] @=? PCRE.preludeTestsFailing@@ -643,8 +643,8 @@ valid_string :: String -> (RegexType->String) -> TestTree valid_string label f = testGroup label- [ ne_string (show rty) $ f rty- | rty<-[TDFA] -- until PCRE has a binding for all macros+ [ ne_string (presentRegexType rty) $ f rty+ | rty<-[TDFA.regexType] -- until PCRE has a binding for all macros ] ne_string :: String -> String -> TestTree
examples/re-tutorial.lhs view
@@ -144,7 +144,7 @@ evalme_TRD_01 = checkThis "evalme_TRD_01" (2) $ ("2016-01-09 2015-12-5 2015-10-05" =~ [re|[0-9]{4}-[0-9]{2}-[0-9]{2}|] :: Int) \end{code} -To determine the string that has matched the modaic `=~~` operator can be used+To determine the string that has matched the monadic `=~~` operator can be used in a `Maybe` context. \begin{code} evalme_TRD_02 = checkThis "evalme_TRD_02" (Just "2016-01-09") $ ("2016-01-09 2015-12-5 2015-10-05" =~~ [re|[0-9]{4}-[0-9]{2}-[0-9]{2}|] :: Maybe String)@@ -569,17 +569,17 @@ The classic tools assocciated with regular expressions have inspired some regex conterparts. - * [Text.RE.Tools.Grep}(Grep.html): takes a regular expression and a+ * [Text.RE.Tools.Grep](Grep.html): takes a regular expression and a file or lazy ByteString (depending upon the variant) and returns all of the matching lines. (Used in the [include](re-include.html) example.) - * [Text.RE.Tools.Lex}(Lex.html): takes an association list of REs and+ * [Text.RE.Tools.Lex](Lex.html): takes an association list of REs and token-generating functions and the input text and returns a list of tokens. This should never be used where performance is important (use Alex), except as a development prototype (used internally in [Text.RE.Internal.NamedCaptures](NamedCaptures.html)). - * [Text.RE.Tools.Lex}(Sed.html) using [Text.RE.Edit](Edit.html):+ * [Text.RE.Tools.Sed](Sed.html) using [Text.RE.Edit](Edit.html): takes an association list of regular expressions and substitution actions, some input text and invokes the associated action on each line of the file that matches one of the REs, substituting the text returned from the action
lib/cabal-masters/constraints-incl.cabal view
@@ -1,4 +1,5 @@ %- regex == <<$version$>>+%- regex-with-pcre == <<$version$>> %- array >= 0.4 %- base >= 4 && < 5 %- base-compat >= 0.6.0
lib/cabal-masters/executables-incl.cabal view
@@ -30,7 +30,7 @@ Main-Is: re-nginx-log-processor.lhs -%build-depends regex array base base-compat bytestring directory regex-base regex-tdfa shelly text time time-locale-compat transformers unordered-containers+%build-depends regex regex-with-pcre array base base-compat bytestring directory regex-base regex-tdfa shelly text time time-locale-compat transformers unordered-containers %test-exe re-prep Hs-Source-Dirs: examples@@ -50,7 +50,7 @@ Other-Modules: TestKit -%build-depends regex array base base-compat bytestring containers directory heredoc regex-base regex-tdfa regex-tdfa-text regex-pcre-builtin smallcheck tasty tasty-hunit tasty-smallcheck template-haskell text unordered-containers+%build-depends regex regex-with-pcre array base base-compat bytestring containers directory heredoc regex-base regex-tdfa regex-tdfa-text regex-pcre-builtin smallcheck tasty tasty-hunit tasty-smallcheck template-haskell text unordered-containers %test-exe re-tutorial Hs-Source-Dirs: examples
lib/cabal-masters/mega-regex.cabal view
@@ -32,6 +32,7 @@ Tag: <<$version$>> %Werror+%filter-regex-with-pcre %include "lib/cabal-masters/constraints-incl.cabal" %include "lib/cabal-masters/library-incl.cabal"
lib/cabal-masters/regex-examples.cabal view
@@ -37,4 +37,4 @@ %include "lib/cabal-masters/executables-incl.cabal" --- Generated from lib/cabal-masters/mega-regex with re-gen-cabals+-- Generated with re-gen-cabals
lib/cabal-masters/regex.cabal view
@@ -1,41 +1,37 @@ Name: regex-Version: <<$version$>>-Synopsis: Toolkit for regex-base-Description: A Regular Expression Toolkit for regex-base with- Compile-time checking of RE syntax, data types for- matches and captures, a text replacement toolkit,- portable options, high-level AWK-like tools- for building text processing apps, regular expression- macros and test bench, a tutorial and copious examples.-Homepage: http://regex.uk-Author: Chris Dornan-License: BSD3-license-file: LICENSE-Maintainer: Chris Dornan <chris@regex.uk>-Copyright: Chris Dornan 2016-2017-Category: Text-Build-type: Simple-Stability: RFC-bug-reports: http://issues.regex.uk--Extra-Source-Files:- README.markdown- changelog--Cabal-Version: >= 1.16--Source-Repository head- type: git- location: https://github.com/iconnect/regex.git--Source-Repository this- Type: git- Location: https://github.com/iconnect/regex.git- Tag: <<$version$>>--%Wwarn+%include "lib/cabal-masters/regex-incl.cabal" %include "lib/cabal-masters/constraints-incl.cabal" -%include "lib/cabal-masters/library-incl.cabal"+Library+ Hs-Source-Dirs: .+ Exposed-Modules:+ Text.RE+ Text.RE.Capture+ Text.RE.CaptureID+ Text.RE.Edit+ Text.RE.Internal.AddCaptureNames+ Text.RE.Internal.EscapeREString+ Text.RE.Internal.NamedCaptures+ Text.RE.Internal.PreludeMacros+ Text.RE.Internal.QQ+ Text.RE.IsRegex+ Text.RE.LineNo+ Text.RE.Options+ Text.RE.Parsers+ Text.RE.Replace+ Text.RE.TDFA+ Text.RE.TDFA.ByteString+ Text.RE.TDFA.ByteString.Lazy+ Text.RE.TDFA.RE+ Text.RE.TDFA.Sequence+ Text.RE.TDFA.String+ Text.RE.TDFA.Text+ Text.RE.TDFA.Text.Lazy+ Text.RE.TestBench+ Text.RE.Tools.Grep+ Text.RE.Tools.Lex+ Text.RE.Tools.Sed --- Generated from lib/cabal-masters/mega-regex with re-gen-cabals+%build-depends array bytestring base base-compat containers hashable heredoc regex-base regex-tdfa regex-tdfa-text template-haskell text time time-locale-compat transformers unordered-containers++-- Generated with re-gen-cabals
lib/mega-regex.cabal view
@@ -1,5 +1,5 @@ Name: regex-Version: 0.5.0.0+Version: 0.6.0.0 Synopsis: Toolkit for regex-base Description: A Regular Expression Toolkit for regex-base with Compile-time checking of RE syntax, data types for@@ -62,7 +62,7 @@ Source-Repository this Type: git Location: https://github.com/iconnect/regex.git- Tag: 0.5.0.0+ Tag: 0.6.0.0 @@ -144,7 +144,7 @@ -Werror Build-depends:- regex == 0.5.0.0+ regex == 0.6.0.0 , array >= 0.4 , base >= 4 && < 5 , base-compat >= 0.6.0@@ -173,7 +173,7 @@ -Werror Build-depends:- regex == 0.5.0.0+ regex == 0.6.0.0 , array >= 0.4 , base >= 4 && < 5 , base-compat >= 0.6.0@@ -199,7 +199,7 @@ -Werror Build-depends:- regex == 0.5.0.0+ regex == 0.6.0.0 , array >= 0.4 , base >= 4 && < 5 , base-compat >= 0.6.0@@ -224,7 +224,7 @@ -Werror Build-depends:- regex == 0.5.0.0+ regex == 0.6.0.0 , array >= 0.4 , base >= 4 && < 5 , base-compat >= 0.6.0@@ -252,7 +252,7 @@ -Werror Build-depends:- regex == 0.5.0.0+ regex == 0.6.0.0 , base >= 4 && < 5 , base-compat >= 0.6.0 , bytestring >= 0.10.2.0@@ -277,7 +277,7 @@ -Werror Build-depends:- regex == 0.5.0.0+ regex == 0.6.0.0 , base >= 4 && < 5 , base-compat >= 0.6.0 , bytestring >= 0.10.2.0@@ -299,7 +299,7 @@ -Werror Build-depends:- regex == 0.5.0.0+ regex == 0.6.0.0 , array >= 0.4 , base >= 4 && < 5 , base-compat >= 0.6.0@@ -328,7 +328,7 @@ -Werror Build-depends:- regex == 0.5.0.0+ regex == 0.6.0.0 , array >= 0.4 , base >= 4 && < 5 , base-compat >= 0.6.0@@ -360,7 +360,7 @@ -Werror Build-depends:- regex == 0.5.0.0+ regex == 0.6.0.0 , base >= 4 && < 5 , base-compat >= 0.6.0 , bytestring >= 0.10.2.0@@ -387,7 +387,7 @@ -Werror Build-depends:- regex == 0.5.0.0+ regex == 0.6.0.0 , base >= 4 && < 5 , base-compat >= 0.6.0 , bytestring >= 0.10.2.0@@ -414,7 +414,7 @@ -Werror Build-depends:- regex == 0.5.0.0+ regex == 0.6.0.0 , array >= 0.4 , base >= 4 && < 5 , base-compat >= 0.6.0@@ -451,7 +451,7 @@ -Werror Build-depends:- regex == 0.5.0.0+ regex == 0.6.0.0 , array >= 0.4 , base >= 4 && < 5 , base-compat >= 0.6.0@@ -489,7 +489,7 @@ -Werror Build-depends:- regex == 0.5.0.0+ regex == 0.6.0.0 , array >= 0.4 , base >= 4 && < 5 , base-compat >= 0.6.0@@ -532,7 +532,7 @@ -Werror Build-depends:- regex == 0.5.0.0+ regex == 0.6.0.0 , array >= 0.4 , base >= 4 && < 5 , base-compat >= 0.6.0@@ -577,7 +577,7 @@ -Werror Build-depends:- regex == 0.5.0.0+ regex == 0.6.0.0 , array >= 0.4 , base >= 4 && < 5 , base-compat >= 0.6.0
lib/version.txt view
@@ -1,1 +1,1 @@-0.5.0.0+0.6.0.0
regex-examples.cabal view
@@ -1,5 +1,5 @@ Name: regex-examples-Version: 0.5.0.0+Version: 0.6.0.0 Synopsis: Tutorial, tests and example programs for regex Description: Tutorial, tests and example programs for regex, a Regular Expression Toolkit for regex-base with@@ -63,7 +63,7 @@ Source-Repository this Type: git Location: https://github.com/iconnect/regex.git- Tag: 0.5.0.0+ Tag: 0.6.0.0 @@ -82,7 +82,7 @@ -Wwarn Build-depends:- regex == 0.5.0.0+ regex == 0.6.0.0 , array >= 0.4 , base >= 4 && < 5 , base-compat >= 0.6.0@@ -111,7 +111,7 @@ -Wwarn Build-depends:- regex == 0.5.0.0+ regex == 0.6.0.0 , array >= 0.4 , base >= 4 && < 5 , base-compat >= 0.6.0@@ -137,7 +137,7 @@ -Wwarn Build-depends:- regex == 0.5.0.0+ regex == 0.6.0.0 , array >= 0.4 , base >= 4 && < 5 , base-compat >= 0.6.0@@ -162,7 +162,7 @@ -Wwarn Build-depends:- regex == 0.5.0.0+ regex == 0.6.0.0 , array >= 0.4 , base >= 4 && < 5 , base-compat >= 0.6.0@@ -190,7 +190,7 @@ -Wwarn Build-depends:- regex == 0.5.0.0+ regex == 0.6.0.0 , base >= 4 && < 5 , base-compat >= 0.6.0 , bytestring >= 0.10.2.0@@ -215,7 +215,7 @@ -Wwarn Build-depends:- regex == 0.5.0.0+ regex == 0.6.0.0 , base >= 4 && < 5 , base-compat >= 0.6.0 , bytestring >= 0.10.2.0@@ -237,7 +237,8 @@ -Wwarn Build-depends:- regex == 0.5.0.0+ regex == 0.6.0.0+ , regex-with-pcre == 0.6.0.0 , array >= 0.4 , base >= 4 && < 5 , base-compat >= 0.6.0@@ -266,7 +267,8 @@ -Wwarn Build-depends:- regex == 0.5.0.0+ regex == 0.6.0.0+ , regex-with-pcre == 0.6.0.0 , array >= 0.4 , base >= 4 && < 5 , base-compat >= 0.6.0@@ -298,7 +300,7 @@ -Wwarn Build-depends:- regex == 0.5.0.0+ regex == 0.6.0.0 , base >= 4 && < 5 , base-compat >= 0.6.0 , bytestring >= 0.10.2.0@@ -325,7 +327,7 @@ -Wwarn Build-depends:- regex == 0.5.0.0+ regex == 0.6.0.0 , base >= 4 && < 5 , base-compat >= 0.6.0 , bytestring >= 0.10.2.0@@ -352,7 +354,8 @@ -Wwarn Build-depends:- regex == 0.5.0.0+ regex == 0.6.0.0+ , regex-with-pcre == 0.6.0.0 , array >= 0.4 , base >= 4 && < 5 , base-compat >= 0.6.0@@ -389,7 +392,8 @@ -Wwarn Build-depends:- regex == 0.5.0.0+ regex == 0.6.0.0+ , regex-with-pcre == 0.6.0.0 , array >= 0.4 , base >= 4 && < 5 , base-compat >= 0.6.0@@ -427,7 +431,7 @@ -Wwarn Build-depends:- regex == 0.5.0.0+ regex == 0.6.0.0 , array >= 0.4 , base >= 4 && < 5 , base-compat >= 0.6.0@@ -470,7 +474,7 @@ -Wwarn Build-depends:- regex == 0.5.0.0+ regex == 0.6.0.0 , array >= 0.4 , base >= 4 && < 5 , base-compat >= 0.6.0@@ -515,7 +519,7 @@ -Wwarn Build-depends:- regex == 0.5.0.0+ regex == 0.6.0.0 , array >= 0.4 , base >= 4 && < 5 , base-compat >= 0.6.0@@ -542,4 +546,4 @@ --- Generated from lib/cabal-masters/mega-regex with re-gen-cabals+-- Generated with re-gen-cabals