>>> match (bounded 2 5 "cat") "catcatcat" [["cat","cat","cat"]] >>> match (bounded 2 5 "cat") "cat" [] >>> match (bounded 2 5 "cat") "catcatcatcatcatcat" []bounded could be implemented naively as follows:
bounded m n p = do x <- choice (map pure [m..n]) count x p
>>> match (lowerBounded 5 dot) "123" [] >>> match (lowerBounded 2 dot) "123" ["123"]
>>> match (upperBounded 5 dot) "123" ["123"] >>> match (upperBounded 2 dot) "123" [] >>> match ((,) <$> upperBounded 2 dot <*> chars) "123" [("12","3"),("1","23")]