Skip to content

Instantly share code, notes, and snippets.

@julien-truffaut
Created March 25, 2016 17:50
Show Gist options
  • Save julien-truffaut/c1ac8d894dbfe4dc847f to your computer and use it in GitHub Desktop.
Save julien-truffaut/c1ac8d894dbfe4dc847f to your computer and use it in GitHub Desktop.
λ> 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 [] [])
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