packages feed

replace-attoparsec 1.0.1.0 → 1.0.2.0

raw patch · 2 files changed

+85/−15 lines, 2 filesPVP ok

version bump matches the API change (PVP)

API changes (from Hackage documentation)

Files

README.md view
@@ -4,6 +4,11 @@ [![Stackage Nightly](http://stackage.org/package/replace-attoparsec/badge/nightly)](http://stackage.org/nightly/package/replace-attoparsec) [![Stackage LTS](http://stackage.org/package/replace-attoparsec/badge/lts)](http://stackage.org/lts/package/replace-attoparsec) +* [Usage Examples](#usage-examples)+* [In the Shell](#in-the-shell)+* [Alternatives](#alternatives)+* [Hypothetically Asked Questions](#hypothetically-asked-questions)+ __replace-attoparsec__ is for finding text patterns, and also editing and replacing the found patterns. This activity is traditionally done with regular expressions,@@ -72,7 +77,7 @@   this library, instead of a template, we get   an `editor` function which can perform any computation, including IO. -## Examples+# Usage Examples  Try the examples in `ghci` by running `cabal v2-repl` in the `replace-attoparsec/`@@ -89,13 +94,13 @@ import Data.Char ``` -### Parsing with `sepCap` family of parser combinators+## Parsing with `sepCap` family of parser combinators  The following examples show how to match a pattern to a string of text and deconstruct the string of text by separating it into sections which match the pattern, and sections which don't match. -#### Pattern match, capture only the parsed result with `sepCap`+### Pattern match, capture only the parsed result with `sepCap`  Separate the input string into sections which can be parsed as a hexadecimal number with a prefix `"0x"`, and sections which can't.@@ -108,7 +113,7 @@ [Right 10,Left " 000 ",Right 65535] ``` -#### Pattern match, capture only the matched text with `findAll`+### Pattern match, capture only the matched text with `findAll`  Just get the strings sections which match the hexadecimal parser, throw away the parsed number.@@ -121,7 +126,7 @@ [Right "0xA",Left " 000 ",Right "0xFFFF"] ``` -#### Pattern match, capture the matched text and the parsed result with `findAllCap`+### Pattern match, capture the matched text and the parsed result with `findAllCap`  Capture the parsed hexadecimal number, as well as the string section which parses as a hexadecimal number.@@ -134,7 +139,7 @@ [Right ("0xA",10),Left " 000 ",Right ("0xFFFF",65535)] ``` -#### Pattern match, capture only the locations of the matched patterns+### Pattern match, capture only the locations of the matched patterns  Find all of the sections of the stream which match a string of whitespace.@@ -149,7 +154,7 @@ [0,2,5] ``` -#### Pattern match balanced parentheses+### Pattern match balanced parentheses  Find the outer parentheses of all balanced nested parentheses. Here's an example of matching a pattern that can't be expressed by a regular@@ -170,13 +175,13 @@ [Right "(())",Left " ",Right "(()())"] ``` -### Edit text strings by running parsers with `streamEdit`+## Edit text strings by running parsers with `streamEdit`  The following examples show how to search for a pattern in a string of text and then edit the string of text to substitute in some replacement text for the matched patterns. -#### Pattern match and replace with a constant+### Pattern match and replace with a constant  Replace all carriage-return-newline instances with newline. @@ -187,7 +192,7 @@ "1\n2\n" ``` -#### Pattern match and edit the matches+### Pattern match and edit the matches  Replace alphabetic characters with the next character in the alphabet. @@ -198,7 +203,7 @@ "IBM 9000" ``` -#### Pattern match and maybe edit the matches, or maybe leave them alone+### Pattern match and maybe edit the matches, or maybe leave them alone  Find all of the string sections *`s`* which can be parsed as a hexadecimal number *`r`*,@@ -214,8 +219,11 @@ "10 000 0xFFFF" ``` -#### Pattern match and edit the matches with IO+### Pattern match and edit the matches with IO +Find an environment variable in curly braces and replace it with its+value from the environment.+ ```haskell import System.Environment streamEditT (char '{' *> manyTill anyChar (char '}')) (fmap T.pack . getEnv) "- {HOME} -"@@ -224,8 +232,53 @@ "- /home/jbrock -" ``` -## Alternatives +# In the Shell++If we're going to have a viable `sed` replacement then we want to be able+to use it easily from the command line. This script uses the+[Stack script interpreter](https://docs.haskellstack.org/en/stable/GUIDE/#script-interpreter)+To find decimal numbers in a stream and replace them with their double.++```haskell+#!/usr/bin/env stack+{- stack+  script+  --resolver nightly-2019-09-13+  --package attoparsec+  --package text+  --package text-show+  --package replace-attoparsec+-}+-- https://docs.haskellstack.org/en/stable/GUIDE/#script-interpreter++{-# LANGUAGE OverloadedStrings #-}++import qualified Data.Text as T+import qualified Data.Text.IO as T+import TextShow+import Data.Attoparsec.Text+import Replace.Attoparsec.Text++main = T.interact $ streamEdit decimal (showt . (* (2::Integer)))+```++If you have+[The Haskell Tool Stack](https://docs.haskellstack.org/en/stable/README/)+installed then you can just copy-paste this into a file named `script.hs` and+run it. (On the first run Stack may need to download the dependencies.)++```bash+$ chmod u+x script.hs+$ echo "1 6 21 107" | ./script.hs+2 12 42 214+```+++# Alternatives++Some libraries that one might consider instead of this one.+ <http://hackage.haskell.org/package/regex-applicative>  <http://hackage.haskell.org/package/regex>@@ -244,7 +297,7 @@  <http://hackage.haskell.org/package/attosplit> -## Hypothetically Asked Questions+# Hypothetically Asked Questions  1. *Is it fast?* @@ -260,4 +313,21 @@    combinator doesn't exist for __parsec__. (I can't find it anywhere.    [Can it be written?](http://www.serpentine.com/blog/2014/05/31/attoparsec/#from-strings-to-buffers-and-cursors)) +3. *Is this a good idea?*++   You may have heard it suggested that monadic parsers are better when+   the input stream is mostly signal, and regular expressions are better+   when the input stream is mostly noise.++   The premise of this library is:+   that sentiment is outdated; monadic parsers are great for finding+   small patterns in a stream of otherwise uninteresting text; and the+   reluctance to forego the speedup opportunities afforded by restricting+   ourselves to regular grammars is an old superstition about+   opportunities which+   [remain mostly unexploited anyway](https://swtch.com/~rsc/regexp/regexp1.html).+   The performance compromise of allowing stack memory allocation (a.k.a pushdown+   automata, a.k.a context-free grammar) was once considered+   [controversial for *general-purpose* programming languages](https://vanemden.wordpress.com/2014/06/18/how-recursion-got-into-programming-a-comedy-of-errors-3/). I think we+   can now resolve that controversy the same way for pattern matching languages. 
replace-attoparsec.cabal view
@@ -1,5 +1,5 @@ name:                replace-attoparsec-version:             1.0.1.0+version:             1.0.2.0 cabal-version:       1.18 synopsis:            Stream edit, find-and-replace with Attoparsec parsers homepage:            https://github.com/jamesdbrock/replace-attoparsec