packages feed

semantic-version-0.0.1: src/Data/SemanticVersion/PreReleaseIdentifiers.hs

{-# OPTIONS_GHC -Wall #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}

module Data.SemanticVersion.PreReleaseIdentifiers where

import Control.Lens
import Data.List.NonEmpty
import Data.SemanticVersion.PreReleaseIdentifier
import Text.Parser.Char
import Text.Parser.Combinators

-- $setup
-- >>> import Text.Parsec(parse)
-- >>> import Data.Either(isLeft)

-- <dot-separated pre-release identifiers> ::= <pre-release identifier>
--                                           | <pre-release identifier> "." <dot-separated pre-release identifiers>
newtype PreReleaseIdentifiers =
  PreReleaseIdentifiers (NonEmpty PreReleaseIdentifier)
  deriving (Eq, Show)

class HasPreReleaseIdentifiers a where
  preReleaseIdentifiers ::
    Lens' a PreReleaseIdentifiers

instance HasPreReleaseIdentifiers PreReleaseIdentifiers where
  preReleaseIdentifiers =
    id

class AsPreReleaseIdentifiers a where
  _PreReleaseIdentifiers ::
    Prism' a PreReleaseIdentifiers

instance AsPreReleaseIdentifiers PreReleaseIdentifiers where
  _PreReleaseIdentifiers =
    id

instance PreReleaseIdentifiers ~ t => Rewrapped PreReleaseIdentifiers t

instance Wrapped PreReleaseIdentifiers where
  type Unwrapped PreReleaseIdentifiers = NonEmpty PreReleaseIdentifier
  _Wrapped' =
    iso
      (\(PreReleaseIdentifiers x) -> x)
      PreReleaseIdentifiers

-- |
--
-- >>> parse (parsePreReleaseIdentifiers <* eof) "parsePreReleaseIdentifiers" "A"
-- Right (PreReleaseIdentifiers (PreReleaseIdentifierAlphanumeric (AlphanumericIdentifierNonDigit (NonDigitLetter (AlphaUpper Upper_A))) :| []))
--
-- >>> isLeft (parse parsePreReleaseIdentifiers "parsePreReleaseIdentifiers" "")
-- True
--
-- >>> parse (parsePreReleaseIdentifiers <* eof) "parsePreReleaseIdentifiers" "Abc-123--XYZ"
-- Right (PreReleaseIdentifiers (PreReleaseIdentifierAlphanumeric (AlphanumericIdentifierNonDigits (NonDigitLetter (AlphaUpper Upper_A)) (IdentifierCharacters (IdentifierCharacterNonDigit (NonDigitLetter (AlphaLower Lower_b)) :| [IdentifierCharacterNonDigit (NonDigitLetter (AlphaLower Lower_c)),IdentifierCharacterNonDigit NonDigitHyphen,IdentifierCharacterDigit DecDigit1,IdentifierCharacterDigit DecDigit2,IdentifierCharacterDigit DecDigit3,IdentifierCharacterNonDigit NonDigitHyphen,IdentifierCharacterNonDigit NonDigitHyphen,IdentifierCharacterNonDigit (NonDigitLetter (AlphaUpper Upper_X)),IdentifierCharacterNonDigit (NonDigitLetter (AlphaUpper Upper_Y)),IdentifierCharacterNonDigit (NonDigitLetter (AlphaUpper Upper_Z))]))) :| []))
--
-- >>> isLeft (parse parsePreReleaseIdentifiers "parsePreReleaseIdentifiers" "+")
-- True
--
-- >>> parse (parsePreReleaseIdentifiers <* eof) "parsePreReleaseIdentifiers" "Abc-123--XYZ.456.abc"
-- Right (PreReleaseIdentifiers (PreReleaseIdentifierAlphanumeric (AlphanumericIdentifierNonDigits (NonDigitLetter (AlphaUpper Upper_A)) (IdentifierCharacters (IdentifierCharacterNonDigit (NonDigitLetter (AlphaLower Lower_b)) :| [IdentifierCharacterNonDigit (NonDigitLetter (AlphaLower Lower_c)),IdentifierCharacterNonDigit NonDigitHyphen,IdentifierCharacterDigit DecDigit1,IdentifierCharacterDigit DecDigit2,IdentifierCharacterDigit DecDigit3,IdentifierCharacterNonDigit NonDigitHyphen,IdentifierCharacterNonDigit NonDigitHyphen,IdentifierCharacterNonDigit (NonDigitLetter (AlphaUpper Upper_X)),IdentifierCharacterNonDigit (NonDigitLetter (AlphaUpper Upper_Y)),IdentifierCharacterNonDigit (NonDigitLetter (AlphaUpper Upper_Z))]))) :| [PreReleaseIdentifierNumeric (NumericIdentifierDigits DecDigitNoZero4 [DecDigit5,DecDigit6]),PreReleaseIdentifierAlphanumeric (AlphanumericIdentifierNonDigits (NonDigitLetter (AlphaLower Lower_a)) (IdentifierCharacters (IdentifierCharacterNonDigit (NonDigitLetter (AlphaLower Lower_b)) :| [IdentifierCharacterNonDigit (NonDigitLetter (AlphaLower Lower_c))])))]))
--
-- >>> parse (parsePreReleaseIdentifiers <* eof) "parsePreReleaseIdentifiers" "Abc-123--XYZ.Abc-123--XYZ.Abc-123--XYZ"
-- Right (PreReleaseIdentifiers (PreReleaseIdentifierAlphanumeric (AlphanumericIdentifierNonDigits (NonDigitLetter (AlphaUpper Upper_A)) (IdentifierCharacters (IdentifierCharacterNonDigit (NonDigitLetter (AlphaLower Lower_b)) :| [IdentifierCharacterNonDigit (NonDigitLetter (AlphaLower Lower_c)),IdentifierCharacterNonDigit NonDigitHyphen,IdentifierCharacterDigit DecDigit1,IdentifierCharacterDigit DecDigit2,IdentifierCharacterDigit DecDigit3,IdentifierCharacterNonDigit NonDigitHyphen,IdentifierCharacterNonDigit NonDigitHyphen,IdentifierCharacterNonDigit (NonDigitLetter (AlphaUpper Upper_X)),IdentifierCharacterNonDigit (NonDigitLetter (AlphaUpper Upper_Y)),IdentifierCharacterNonDigit (NonDigitLetter (AlphaUpper Upper_Z))]))) :| [PreReleaseIdentifierAlphanumeric (AlphanumericIdentifierNonDigits (NonDigitLetter (AlphaUpper Upper_A)) (IdentifierCharacters (IdentifierCharacterNonDigit (NonDigitLetter (AlphaLower Lower_b)) :| [IdentifierCharacterNonDigit (NonDigitLetter (AlphaLower Lower_c)),IdentifierCharacterNonDigit NonDigitHyphen,IdentifierCharacterDigit DecDigit1,IdentifierCharacterDigit DecDigit2,IdentifierCharacterDigit DecDigit3,IdentifierCharacterNonDigit NonDigitHyphen,IdentifierCharacterNonDigit NonDigitHyphen,IdentifierCharacterNonDigit (NonDigitLetter (AlphaUpper Upper_X)),IdentifierCharacterNonDigit (NonDigitLetter (AlphaUpper Upper_Y)),IdentifierCharacterNonDigit (NonDigitLetter (AlphaUpper Upper_Z))]))),PreReleaseIdentifierAlphanumeric (AlphanumericIdentifierNonDigits (NonDigitLetter (AlphaUpper Upper_A)) (IdentifierCharacters (IdentifierCharacterNonDigit (NonDigitLetter (AlphaLower Lower_b)) :| [IdentifierCharacterNonDigit (NonDigitLetter (AlphaLower Lower_c)),IdentifierCharacterNonDigit NonDigitHyphen,IdentifierCharacterDigit DecDigit1,IdentifierCharacterDigit DecDigit2,IdentifierCharacterDigit DecDigit3,IdentifierCharacterNonDigit NonDigitHyphen,IdentifierCharacterNonDigit NonDigitHyphen,IdentifierCharacterNonDigit (NonDigitLetter (AlphaUpper Upper_X)),IdentifierCharacterNonDigit (NonDigitLetter (AlphaUpper Upper_Y)),IdentifierCharacterNonDigit (NonDigitLetter (AlphaUpper Upper_Z))])))]))
parsePreReleaseIdentifiers ::
  CharParsing p =>
  p PreReleaseIdentifiers
parsePreReleaseIdentifiers =
  PreReleaseIdentifiers <$> sepByNonEmpty parsePreReleaseIdentifier (char '.')