From d73e5f5972bf2e0f8332df3a5df8448ab8bcc6c6 Mon Sep 17 00:00:00 2001 From: Anton Vakhrushev Date: Sun, 12 Nov 2017 06:32:41 +0300 Subject: [PATCH] Add sequence parsing --- src/Field.hs | 22 ++++++++++++++++++---- test/FieldSpec.hs | 12 +++++++----- test/HelperSpec.hs | 1 - 3 files changed, 25 insertions(+), 10 deletions(-) diff --git a/src/Field.hs b/src/Field.hs index 30f7f0f..3163ebc 100644 --- a/src/Field.hs +++ b/src/Field.hs @@ -20,22 +20,25 @@ parseField text constraint | isAll = Just (Field All Every) | isNumber = Just (Field (Range number number) Every) | isRange = Just (Field (Range leftBound rightBound) Every) + | isSequence = Just (Field (Sequence numbers) Every) | otherwise = Nothing where -- All isAll = parseAll text -- Number numberParseResult = parseNumber text constraint - isNumber = isJust $ numberParseResult + isNumber = isJust numberParseResult number = fromJust numberParseResult -- Range rangeParseResult = parseRange text constraint - isRange = isJust $ rangeParseResult + isRange = isJust rangeParseResult rangeValues (Just p) = p leftBound = fst (rangeValues rangeParseResult) rightBound = snd (rangeValues rangeParseResult) - -- -- Sequence - -- matchSequence = matchRegex (mkRegex "(([0-9]+)[, ]?)+") s + -- Sequence + sequenceParseResult = parseSequence text constraint + isSequence = isJust sequenceParseResult + numbers = fromJust sequenceParseResult parseAll :: String -> Bool parseAll "*" = True @@ -63,3 +66,14 @@ parseRange text constraint start = read (pieces !! 0) :: Int end = read (pieces !! 1) :: Int isValid = isTwo && isAllNumbers && start <= start && (start, end) `inside` constraint + +parseSequence :: String -> Constraint -> Maybe [Int] +parseSequence text constraint + | isValid = Just numbers + | otherwise = Nothing + where + pieces = wordsWhen (== ',') text + isAllNumbers = all isNumber pieces + numbers = map read pieces + allInRange = all (\x -> x `inRange` constraint) numbers + isValid = length pieces >= 2 && isAllNumbers && allInRange diff --git a/test/FieldSpec.hs b/test/FieldSpec.hs index bd257e5..6c1dcf1 100644 --- a/test/FieldSpec.hs +++ b/test/FieldSpec.hs @@ -1,7 +1,6 @@ module FieldSpec (main, spec) where import Test.Hspec - import Constraint import Field @@ -20,12 +19,15 @@ spec = do it "fails constraints" $ parseNumber "10" (Constraint 0 5) `shouldBe` Nothing - describe "Field" $ do - it "can be created from asterisk" $ + describe "Field can be created from" $ do + it "asterisk" $ parseField "*" (Constraint 0 0) `shouldBe` Just (Field All Every) - it "can be created from number" $ + it "number" $ parseField "10" (Constraint 0 10) `shouldBe` Just (Field (Range 10 10) Every) - it "can be created from range" $ + it "range" $ parseField "10-20" (Constraint 0 59) `shouldBe` Just (Field (Range 10 20) Every) + + it "sequence" $ + parseField "1,2,3" (Constraint 0 59) `shouldBe` Just (Field (Sequence [1, 2, 3]) Every) diff --git a/test/HelperSpec.hs b/test/HelperSpec.hs index 5c59034..25818df 100644 --- a/test/HelperSpec.hs +++ b/test/HelperSpec.hs @@ -1,7 +1,6 @@ module HelperSpec (main, spec) where import Test.Hspec - import Helper main :: IO ()