Created
March 25, 2016 17:50
-
-
Save julien-truffaut/c1ac8d894dbfe4dc847f to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
λ> parseString parseSemVer mempty "1.0.0-alpha+001" | |
Success (SemVer 1 0 0 [NOSS "alpha"] [NOSI 1]) | |
λ> parseString parseSemVer mempty "1.0.0+20130313144700" | |
Success (SemVer 1 0 0 [] [NOSI 20130313144700]) | |
λ> parseString parseSemVer mempty "1.0.0" | |
Success (SemVer 1 0 0 [] []) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
module SemVer where | |
import Text.Trifecta | |
import Control.Applicative | |
data NumberOrString = NOSS String | NOSI Integer deriving (Show, Eq, Ord) | |
type Major = Integer | |
type Minor = Integer | |
type Patch = Integer | |
type Release = [NumberOrString] | |
type Metadata = [NumberOrString] | |
data SemVer = SemVer Major Minor Patch Release Metadata deriving (Show, Eq, Ord) | |
parseSemVer :: Parser SemVer | |
parseSemVer = do | |
major <- integer | |
_ <- char '.' | |
minor <- integer | |
_ <- char '.' | |
patch <- integer | |
release <- try (char '-' *> parseReleaseOrMetadata) <|> pure mempty | |
metadata <- try (char '+' *> parseReleaseOrMetadata) <|> pure mempty | |
return $ SemVer major minor patch release metadata | |
parseNumberOrString :: Parser NumberOrString | |
parseNumberOrString = (NOSI <$> integer) <|> (NOSS <$> (some letter)) | |
parseReleaseOrMetadata :: Parser [NumberOrString] | |
parseReleaseOrMetadata = | |
((:) <$> (try (parseNumberOrString <* char '.')) | |
<*> parseReleaseOrMetadata) <|> | |
pure <$> parseNumberOrString |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment