regexdot 0.11.1.2 → 0.12.0.1
raw patch · 15 files changed
+125/−96 lines, 15 filesdep +data-defaultdep ~toolshedPVP ok
version bump matches the API change (PVP)
Dependencies added: data-default
Dependency ranges changed: toolshed
API changes (from Hackage documentation)
- RegExDot.CompilationOptions: instance ToolShed.Defaultable.Defaultable RegExDot.CompilationOptions.CompilationOptions
- RegExDot.ExecutionOptions: instance ToolShed.Defaultable.Defaultable RegExDot.ExecutionOptions.ExecutionOptions
- RegExDot.RegEx: deconstructAlternatives :: Alternatives m -> [ExtendedRegEx m]
+ RegExDot.BracketExpressionMember: infix 4 =~
+ RegExDot.CompilationOptions: instance Data.Default.Class.Default RegExDot.CompilationOptions.CompilationOptions
+ RegExDot.ConsumptionProfile: infixr 2 <>
+ RegExDot.ConsumptionProfile: infixr 5 |+|
+ RegExDot.DSL: infixr 5 <~>
+ RegExDot.ExecutionOptions: instance Data.Default.Class.Default RegExDot.ExecutionOptions.ExecutionOptions
+ RegExDot.RegEx: [deconstructAlternatives] :: Alternatives m -> [ExtendedRegEx m]
+ RegExDot.RegEx: infix 4 /~
+ RegExDot.Repeatable: infix 6 ^#
Files
- .ghci +1/−0
- README.markdown +6/−4
- changelog.markdown +62/−40
- copyright +1/−1
- regexdot.cabal +14/−8
- src-lib/RegExDot/CompilationOptions.hs +4/−4
- src-lib/RegExDot/Consumer.hs +1/−1
- src-lib/RegExDot/ConsumptionProfile.hs +6/−8
- src-lib/RegExDot/ExecutionOptions.hs +4/−4
- src-lib/RegExDot/Meta.hs +1/−1
- src-lib/RegExDot/RegEx.hs +13/−13
- src-lib/RegExDot/RegExOpts.hs +6/−6
- src-lib/RegExDot/Repeatable.hs +2/−2
- src-lib/RegExDot/Result.hs +1/−1
- src-lib/RegExDot/Tree.hs +3/−3
+ .ghci view
@@ -0,0 +1,1 @@+:set -isrc-lib:dist/build/autogen -optP-include -optPdist/build/autogen/cabal_macros.h
README.markdown view
@@ -1,7 +1,9 @@-# **RegExDot**.+# **RegExDot** -This is **RegExDot**, a polymorphic regex-engine.+[](https://hackage.haskell.org/package/regexdot) [](https://travis-ci.org/functionalley/RegExDot) +This is "**RegExDot**", a polymorphic regex-engine.+ ## Installation It can be built and installed using [Cabal](https://www.haskell.org/cabal/users-guide/installing-packages.html).@@ -12,11 +14,11 @@ ## License -For information on copying and distributing this package, see the file **LICENSE** in this directory.+For information on copying and distributing this package, see the file "**LICENSE**" in this directory. ## Bug-reporting -Bug-reports should be emailed to <regexdot *at* functionalley *dot* eu>.+Bug-reports should be emailed to <regexdot@functionalley.eu>. ## Author
changelog.markdown view
@@ -1,53 +1,75 @@-# 2010-11-18 Dr. Alistair Ward <regexdot at functionalley dot eu>+# 2010-11-18 Dr. Alistair Ward <regexdot@functionalley.eu> ## 0.9.0.0- * First version of the package.+* First version of the package.+ ## 0.10.0.0- * Reacted to major-number changes in the package **ToolShed-0.10.0.0**.- * Created **src/RegExDot/** sub-directory & then modified module-names accordingly.- * Pacified **hlint**.- * Added a makefile.- * Removed awkward unary operators from **Repeatable.hs**.- * Qualified identifiers used in error-messages.+* Reacted to major-number changes in the package "**ToolShed-0.10.0.0**".+* Created sub-directory "**src/RegExDot/**" & then modified module-names accordingly.+* Pacified **hlint**.+* Added a makefile.+* Removed awkward unary operators from **Repeatable.hs**.+* Qualified identifiers used in error-messages.+ ## 0.10.0.1- * Ported to ghc-7.0.1:- Used definitions of `NFData` & `rnf` from new package **deepseq**, rather than **parallel**.- Replaced reference to the deprecated function `Control.Parallel.Strategies.parFlatMap` with `concat . Control.Parallel.Strategies.parMap`.+* Ported to **ghc-7.0.1**:+ + Used definitions of `NFData` & `rnf` from new package "**deepseq**", rather than "**parallel**".+ + Replaced reference to the deprecated function `Control.Parallel.Strategies.parFlatMap` with `concat . Control.Parallel.Strategies.parMap`.+ ## 0.10.1.0- * Set @threaded@ flag to @True@ by default.- * Replaced use of @threaded@-flag in source-code, with CABAL CPP-macro.- * Relocated **RegExDot.Options** to **ToolShed.Options**.+* Set @threaded@ flag to @True@ by default.+* Replaced use of @threaded@-flag in source-code, with CABAL CPP-macro.+* Relocated module "**RegExDot.Options**" to "**ToolShed.Options**".+ ## 0.10.2.0- * Renamed package from **RegExDot** to **regexdot**, for compatibility with Debian's *.deb*-format.+* Renamed package "**RegExDot**" to "**regexdot**", for compatibility with Debian's *.deb*-format.+ ## 0.10.2.1- * Added manually controlled **llvm** flag to the *.cabal*-file.- * Changed identifier for type-parameters, to better reflect its role.- * Reacted to the creation of module **ToolShed.Defaultable**.- * Uploaded to [Hackage](http://hackage.haskell.org/packages/hackage.html).+* Added manually controlled flag "**llvm**" to the *.cabal*-file.+* Changed identifier for type-parameters, to better reflect its role.+* Reacted to the creation of module "**ToolShed.Defaultable**".+* Uploaded to [Hackage](http://hackage.haskell.org/package/regexdot).+ ## 0.10.2.2- * Amended the *.cabal*-file to more correctly specify dependency on package **toolshed**.- * Used new module **ToolShed.Pair** from package **toolshed-0.12.0.0**.- * Guarded **eager-blackholing** flag in the *.cabal*-file.+* Amended the *.cabal*-file to more correctly specify dependency on package "**toolshed**".+* Used new module "**ToolShed.Pair**" from package "**toolshed-0.12.0.0**".+* Guarded flag "**eager-blackholing**" in the *.cabal*-file.+ ## 0.11.0.0- * Replaced `(+ 1)` and `(- 1)` with the faster calls `succ` and `pred`, in **RegExDot.RegEx**.- * Reacted to new module-hierarchy, creation of new module **ToolShed.Data.List.Splits** and addition of method `ToolShed.SelfValidate.getErrors`, in **toolshed-0.13.0.0**, and used it to improved error-reporting in `instance Read RegExDot.RegEx.ExtendedRegEx`.- * Minor reworking of `RegExDot.Repeatable.repeatableParser`.- * Replaced `System` with `System.Environment` and `System.Exit`.+* Replaced `(+ 1)` and `(- 1)` with the faster calls `succ` and `pred`, in module "**RegExDot.RegEx**".+* Reacted to; new module-hierarchy, creation of new module "**ToolShed.Data.List.Splits**", and addition of method `ToolShed.SelfValidate.getErrors` in package "**toolshed-0.13.0.0**", and used it to improved error-reporting in `instance Read RegExDot.RegEx.ExtendedRegEx`.+* Minor reworking of `RegExDot.Repeatable.repeatableParser`.+* Replaced `System` with `System.Environment` and `System.Exit`.+ ## 0.11.0.1- * Added class `Eq` to the context of `RegExDot.RegEx.safeReciprocal`, for migration to **ghc-7.4**.+* Added class `Eq` to the context of `RegExDot.RegEx.safeReciprocal`, for migration to **ghc-7.4**.+ ## 0.11.1.0- * Removed comments referring to deleted module **ToolShed.Unsafe**, from **RegExDot.RegEx**.- * Removed `Show` from the context of functions in **RegExDot.RegEx**- * Exported a new constant `RegExDot.Anchor.unanchored`.- * Refactored `RegExDot.ConsumptionProfile.withinConsumptionBounds`.+* Removed comments referring to deleted module "**ToolShed.Unsafe**", from **RegExDot.RegEx**.+* Removed `Show` from the context of functions in module "**RegExDot.RegEx**".+* Exported a new constant `RegExDot.Anchor.unanchored`.+* Refactored `RegExDot.ConsumptionProfile.withinConsumptionBounds`.+ ## 0.11.1.1- * Tested with **haskell-platform-2013.2.0.0**.- * Replaced preprocessor-directives with **build-depends** constraints in the *.cabal*-file.- * In function `RegExDot.RegEx.findMatch.findMatchSlave.matchPairList`, changed `fromIntegral` (which required a type-signature) to `toRational`.- * Either replaced instances of `(<$>)` with `fmap` to avoid ambiguity between **Control.Applicative** & **Prelude** which (from **base-4.8**) also exports this symbol, or hid the symbol when importing the **Prelude**..+* Tested with **haskell-platform-2013.2.0.0**.+* Replaced preprocessor-directives with **build-depends** constraints in the *.cabal*-file.+* In function `RegExDot.RegEx.findMatch.findMatchSlave.matchPairList`, changed `fromIntegral` (which required a type-signature) to `toRational`.+* Either replaced instances of `(<$>)` with `fmap` to avoid ambiguity between modules "**Control.Applicative**" & "**Prelude**" which (from package "**base-4.8**") also exports this symbol, or hid the symbol when importing the module "**Prelude**".+ ## 0.11.1.2- * Added **Default-language**-specification to the *.cabal*-file.- * Added file **README.markdown**.- * Converted this file to markdown-format.- * Renamed directory **src/** to **src-lib/** for consistency with other packages. - * Used **CPP** to control the import of symbols from **Control.Applicative**.+* Added "**Default-language**"-specification to the *.cabal*-file.+* Added file "**README.markdown**".+* Converted this file to markdown-format.+* Renamed directory "**src/**" to "**src-lib/**" for consistency with other packages. +* Used **CPP** to control the import of symbols from **Control.Applicative**.++## 0.12.0.0+* Corrected the markdown-syntax in this file.+* Uploaded to [GitHub](https://github.com/functionalley/RegExDot.git).+* Added file **.travis.yml** to control testing by <https://docs.travis-ci.com>.+* Added file **.ghci**.+* Replaced use of module **ToolShed.Defaultable** with **Data.Default**.+* Reimplemented **RegExDot.RegEx.deconstruct** using record-syntax.+* Tested with **ghc-8.0.1**.+## 0.12.0.1+* Checked that pre-processor macros are defined.
copyright view
@@ -1,5 +1,5 @@ Author:- Dr. Alistair Ward <regexdot at functionalley dot eu>.+ Dr. Alistair Ward <regexdot@functionalley.eu>. Copyright: Copyright (C) 2010-2011 Dr. Alistair Ward. All Rights Reserved.
regexdot.cabal view
@@ -14,7 +14,7 @@ -- along with RegExDot. If not, see <http://www.gnu.org/licenses/>. Name: regexdot-Version: 0.11.1.2+Version: 0.12.0.1 Cabal-version: >= 1.10 Copyright: (C) 2010-2015 Dr. Alistair Ward License: GPL@@ -25,17 +25,22 @@ Build-type: Simple Description: Provides a portable, POSIX, extended regex-engine, designed to process a list of /arbitrary/ objects. Category: Search, Regex-Tested-with: GHC == 6.10, GHC == 6.12, GHC == 7.0, GHC == 7.4, GHC == 7.6, GHC == 7.8, GHC == 7.10+Tested-with: GHC == 7.4, GHC == 7.6, GHC == 7.8, GHC == 7.10.1, GHC == 8.0.1 Homepage: http://functionalley.eu/RegExDot/regExDot.html-Maintainer: mailto <colon> regexdot <at> functionalley <dot> eu-Bug-reports: mailto <colon> regexdot <at> functionalley <dot> eu+Maintainer: mailto:regexdot@functionalley.eu+Bug-reports: mailto:regexdot@functionalley.eu -- None of these files are needed at run-time. Extra-source-files:+ .ghci changelog.markdown copyright README.markdown +source-repository head+ type: git+ location: https://github.com/functionalley/RegExDot+ -- Enable using: 'cabal configure -f llvm'. flag llvm Description: Whether the 'llvm' compiler-backend has been installed and is required for code-generation.@@ -44,7 +49,7 @@ Library Default-language: Haskell2010- GHC-options: -Wall -O2 -fno-warn-tabs+ GHC-options: -O2 -Wall -fno-warn-tabs Hs-source-dirs: src-lib Exposed-modules:@@ -71,15 +76,16 @@ Build-depends: base == 4.*,+ data-default, deepseq >= 1.1, parallel >= 3.0, parsec == 3.*,- toolshed >= 0.13+ toolshed >= 0.17 if impl(ghc >= 7.4.1)- GHC-prof-options: -prof -fprof-auto -fprof-cafs+ GHC-prof-options: -fprof-auto -fprof-cafs else- GHC-prof-options: -prof -auto-all -caf-all+ GHC-prof-options: -auto-all -caf-all if impl(ghc >= 7.0) && flag(llvm) GHC-options: -fllvm
src-lib/RegExDot/CompilationOptions.hs view
@@ -1,5 +1,5 @@ {-- Copyright (C) 2010 Dr. Alistair Ward+ Copyright (C) 2010-2015 Dr. Alistair Ward This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by@@ -32,7 +32,7 @@ CompilationOptions(..) ) where -import qualified ToolShed.Defaultable+import qualified Data.Default import qualified ToolShed.Options -- | The switch(es) used to control compilation of the /regex/-engine.@@ -40,8 +40,8 @@ complyStrictlyWithPosix :: Bool -- ^ Define the offset of captured data, corresponding to a sub-expression which matched zero times, as the artificial value @-1@ specified by POSIX. } deriving (Eq, Show) -instance ToolShed.Defaultable.Defaultable CompilationOptions where- defaultValue = ToolShed.Options.blankValue { complyStrictlyWithPosix = True }+instance Data.Default.Default CompilationOptions where+ def = ToolShed.Options.blankValue { complyStrictlyWithPosix = True } instance ToolShed.Options.Options CompilationOptions where blankValue = MkCompilationOptions { complyStrictlyWithPosix = undefined }
src-lib/RegExDot/Consumer.hs view
@@ -53,7 +53,7 @@ {- | * A measure of the complexity of a /regex/, which has some baring on either the time-complexity or the space-complexity of the solution. - * <http://en.wikipedia.org/wiki/Star_height>+ * <https://en.wikipedia.org/wiki/Star_height> -} type StarHeight = Int
src-lib/RegExDot/ConsumptionProfile.hs view
@@ -49,7 +49,7 @@ import qualified RegExDot.ConsumptionBounds as ConsumptionBounds import qualified ToolShed.SelfValidate -#if !MIN_VERSION_base(4,8,0)+#if !defined(MIN_VERSION_base) || !MIN_VERSION_base(4,8,0) import Control.Applicative((<$>), (<*>)) #endif @@ -68,13 +68,11 @@ } deriving (Eq, Read, Show) instance ToolShed.SelfValidate.SelfValidator ConsumptionProfile where- getErrors c@(- MkConsumptionProfile {- consumptionBounds = (fewest, most),- hasSpecificRequirement = hasSpecificRequirement',- canConsumeAnything = canConsumeAnything'- }- ) = ToolShed.SelfValidate.extractErrors [+ getErrors c@ MkConsumptionProfile {+ consumptionBounds = (fewest, most),+ hasSpecificRequirement = hasSpecificRequirement',+ canConsumeAnything = canConsumeAnything'+ } = ToolShed.SelfValidate.extractErrors [ (fewest < 0, "Negative fewest=" ++ show fewest ++ "."), ( case most of
src-lib/RegExDot/ExecutionOptions.hs view
@@ -1,5 +1,5 @@ {-- Copyright (C) 2010 Dr. Alistair Ward+ Copyright (C) 2010-2015 Dr. Alistair Ward This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by@@ -35,7 +35,7 @@ setVerbose ) where -import qualified ToolShed.Defaultable+import qualified Data.Default import qualified ToolShed.Options -- | The switches used to control execution of the /regex/-engine.@@ -57,8 +57,8 @@ validateMinConsumptionOfAlternatives :: Bool -- ^ When the number of repetitions of a /RegExDot.RegEx.CaptureGroup/ is precisely specified, check whether the resulting minimum data-requirement is available. } deriving (Eq, Show) -instance ToolShed.Defaultable.Defaultable ExecutionOptions where- defaultValue = setVerbose False $ ToolShed.Options.blankValue {+instance Data.Default.Default ExecutionOptions where+ def = setVerbose False $ ToolShed.Options.blankValue { abortTrialRepetitionsOnInherentFailure = True, -- Regrettably, this slightly reduces performance for most non-pathological patterns. catchIncompatibleAnchors = True, checkExistenceOfInelasticTail = True,
src-lib/RegExDot/Meta.hs view
@@ -1,5 +1,5 @@ {-- Copyright (C) 2010 Dr. Alistair Ward+ Copyright (C) 2010-2015 Dr. Alistair Ward This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by
src-lib/RegExDot/RegEx.hs view
@@ -50,7 +50,7 @@ [@REFERENCES@] - * <http://en.wikipedia.org/wiki/Regular_expression>+ * <https://en.wikipedia.org/wiki/Regular_expression> * <http://swtch.com/~rsc/regexp/regexp1.html> @@ -121,7 +121,10 @@ RepeatablePattern, -- Transformation, -- ** Data-types- Alternatives(..),+ Alternatives(+ MkAlternatives,+ deconstructAlternatives+ ), Match, ExtendedRegEx(..), Pattern(..),@@ -148,8 +151,7 @@ showsMaybeAnchor, simply, transformExtendedRegEx,--- ** Accessors (Deconstructors)- deconstructAlternatives,+-- ** Accessors -- getInputData, -- ** Operators (+~),@@ -218,11 +220,9 @@ * One could amalgamate this with 'Pattern', since it seems to exist merely as a peg to hang /instance/-declarations from. -}-newtype Alternatives m = MkAlternatives [ExtendedRegEx m] deriving Eq---- | Accessor, to expose the guts.-deconstructAlternatives :: Alternatives m -> [ExtendedRegEx m]-deconstructAlternatives (MkAlternatives extendedRegExList) = extendedRegExList+newtype Alternatives m = MkAlternatives {+ deconstructAlternatives :: [ExtendedRegEx m]+} deriving Eq -- | Similar to 'fmap', but operates on ['ExtendedRegEx'], rather than just @a@. transformAlternatives@@ -241,12 +241,12 @@ readsPrec _ ('\t' : s) = reads s -- Consume white-space. readsPrec _ s = case reads s of [(extendedRegEx, s1)] -> case dropWhile Data.Char.isSpace s1 of- ('|' : s2) -> Control.Arrow.first (transformAlternatives (extendedRegEx :)) `map` reads s2 {-singleton-}+ '|' : s2 -> Control.Arrow.first (transformAlternatives (extendedRegEx :)) `map` reads s2 {-singleton-} _ -> [(MkAlternatives [extendedRegEx], s1)] _ -> [] -- No parse. instance Show m => Show (Alternatives m) where- showsPrec _ = foldl (.) (showString "") . Data.List.intersperse (showChar alternativeExtendedRegExSeparatorToken) . map shows . deconstructAlternatives -- Replace the default list-format, with 'egrep'-syntax.+ showsPrec _ = foldl (.) id . Data.List.intersperse (showChar alternativeExtendedRegExSeparatorToken) . map shows . deconstructAlternatives -- Replace the default list-format, with 'egrep'-syntax. instance Consumer.Consumer (Alternatives m) where consumptionProfile = Consumer.aggregateConsumptionProfilesFromAlternatives . deconstructAlternatives@@ -297,7 +297,7 @@ readsPrec _ ('\t' : s) = reads s -- Consume white-space. readsPrec _ ('(' : s) = case {-Alternatives.-} reads s of [(alternatives, s1)] -> case dropWhile Data.Char.isSpace s1 of- (')' : s2) -> [(CaptureGroup alternatives, s2)]+ ')' : s2 -> [(CaptureGroup alternatives, s2)] _ -> [] -- No parse. _ -> [] -- No parse. readsPrec _ s = case reads s of@@ -836,7 +836,7 @@ using a single repetition of 'concatenationFromAlternative' followed by a replacement infallible 'concatenationTail'. -} then {-#SCC "abortTrialRepetitionsOnInherentFailure" #-} case maybeMatchPairList of- (Nothing {-failed attempt-} : _ {-subsequent attempt worth bypassing-} : _) -> if (+ Nothing {-failed attempt-} : _ {-subsequent attempt worth bypassing-} : _ -> if ( minConsumptionConcatenationFromAlternative == 0 -- Can delegate consumption of unconsumable data to the infallible tail => unprovable culpability. ) || inputData =~ RegExOpts.mkRegEx MkExtendedRegEx { bowAnchor = Just Anchor.Bow,
src-lib/RegExDot/RegExOpts.hs view
@@ -2,7 +2,7 @@ {-# OPTIONS_GHC -fno-warn-orphans #-} {-- Copyright (C) 2010 Dr. Alistair Ward+ Copyright (C) 2010-2015 Dr. Alistair Ward This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by@@ -33,13 +33,13 @@ RegExOpts(..), -- * Functions setVerbose,--- ** Constructors+-- ** Constructor mkRegEx ) where +import qualified Data.Default import qualified RegExDot.CompilationOptions as CompilationOptions import qualified RegExDot.ExecutionOptions as ExecutionOptions-import qualified ToolShed.Defaultable -- | Aggregates both 'ExecutionOptions.ExecutionOptions' & 'CompilationOptions.CompilationOptions' with a polymorphic /regex/, to form a complete job-description. data RegExOpts a = MkRegExOpts {@@ -51,11 +51,11 @@ instance Functor RegExOpts where fmap f regExOpts = regExOpts { regEx = f $ regEx regExOpts } --- | Smart constructor using 'ToolShed.Defaultable.defaultValue'.+-- | Smart constructor. mkRegEx :: a -> RegExOpts a mkRegEx r = MkRegExOpts {- compilationOptions = ToolShed.Defaultable.defaultValue,- executionOptions = ToolShed.Defaultable.defaultValue,+ compilationOptions = Data.Default.def,+ executionOptions = Data.Default.def, regEx = r }
src-lib/RegExDot/Repeatable.hs view
@@ -29,7 +29,7 @@ * In the context of /regex/es, this concept is known as /Quantification/. - * /regex/es evolved from the minimal ability to optionally qualify the datum with a <http://en.wikipedia.org/wiki/Kleene_star> suffix.+ * /regex/es evolved from the minimal ability to optionally qualify the datum with a <https://en.wikipedia.org/wiki/Kleene_star> suffix. More exotic repetition-specifications could be composed by concatenating these atomic building-blocks. Here, I've taken the contrary top-down view, & assumed that all data are qualified by a full 'RepetitionBounds', which in most cases will degenerate into a simpler form. @@ -90,7 +90,7 @@ import qualified ToolShed.Data.Pair import qualified ToolShed.SelfValidate -#if !MIN_VERSION_base(4,8,0)+#if !defined(MIN_VERSION_base) || !MIN_VERSION_base(4,8,0) import Control.Applicative((<$>), (<*>)) #endif
src-lib/RegExDot/Result.hs view
@@ -24,7 +24,7 @@ module RegExDot.Result( -- * Functions--- ** Accessors (Deconstructors)+-- ** Accessors getMatchList, getPreMatch, getPostMatch,
src-lib/RegExDot/Tree.hs view
@@ -1,5 +1,5 @@ {-- Copyright (C) 2010 Dr. Alistair Ward+ Copyright (C) 2010-2015 Dr. Alistair Ward This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by@@ -19,7 +19,7 @@ [@DESCRIPTION@] - * Defines a specific type of tree-structure, which is composed from either a datum, or a list of Tree-lists; <http://en.wikipedia.org/wiki/Rose_Tree>.+ * Defines a specific type of tree-structure, which is composed from either a datum, or a list of Tree-lists; <https://en.wikipedia.org/wiki/Rose_Tree>. * This more general tree-structure has the shape of a regular-expression match. @@ -45,7 +45,7 @@ -- | A general purpose tree-type structure. data Tree a = Leaf a -- ^ The payload.- | Node [TreeList a] -- ^ Recurse. NB: a list of lists is required to contain the /MatchLists/ resulting from repeated /Alternatives/.+ | Node [TreeList a] -- ^ Recurse. N.B.: a list of lists is required to contain the /MatchLists/ resulting from repeated /Alternatives/. deriving Eq -- | A list of 'Tree's; significant only because it is the essence of the recursive nature of 'Tree'.