From d5e04e14d72fd3bd978839d2ea7d8a8ed7ec3dff Mon Sep 17 00:00:00 2001 From: Gabriel Gonzalez Date: Sun, 14 Jun 2015 17:18:55 -0700 Subject: [PATCH] Added `invert` function. Fixes #60 --- src/Turtle/Pattern.hs | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/Turtle/Pattern.hs b/src/Turtle/Pattern.hs index b3b4b4a..f5419cd 100644 --- a/src/Turtle/Pattern.hs +++ b/src/Turtle/Pattern.hs @@ -81,6 +81,7 @@ module Turtle.Pattern ( , prefix , suffix , has + , invert , once , star , plus @@ -426,6 +427,18 @@ signed p = do sign <- (char '+' *> pure id) <|> (char '-' *> pure negate) <|> (pure id) fmap sign p +{-| @(`invert` p)@ succeeds if @p@ fails and fails if @p@ succeeds + +>>> match (invert "A") "A" +[] +>>> match (invert "A") "B" +[()] +-} +invert :: Pattern a -> Pattern () +invert p = Pattern (StateT (\str -> case runStateT (runPattern p) str of + [] -> [((), "")] + _ -> [] )) + {-| Match a `Char`, but return `Text` >>> match (once (char '1')) "1"