{-# 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 (PreReleaseIdentifiers -> PreReleaseIdentifiers -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: PreReleaseIdentifiers -> PreReleaseIdentifiers -> Bool
$c/= :: PreReleaseIdentifiers -> PreReleaseIdentifiers -> Bool
== :: PreReleaseIdentifiers -> PreReleaseIdentifiers -> Bool
$c== :: PreReleaseIdentifiers -> PreReleaseIdentifiers -> Bool
Eq, Int -> PreReleaseIdentifiers -> ShowS
[PreReleaseIdentifiers] -> ShowS
PreReleaseIdentifiers -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [PreReleaseIdentifiers] -> ShowS
$cshowList :: [PreReleaseIdentifiers] -> ShowS
show :: PreReleaseIdentifiers -> String
$cshow :: PreReleaseIdentifiers -> String
showsPrec :: Int -> PreReleaseIdentifiers -> ShowS
$cshowsPrec :: Int -> PreReleaseIdentifiers -> ShowS
Show)

class HasPreReleaseIdentifiers a where
  preReleaseIdentifiers ::
    Lens' a PreReleaseIdentifiers

instance HasPreReleaseIdentifiers PreReleaseIdentifiers where
  preReleaseIdentifiers :: Lens' PreReleaseIdentifiers PreReleaseIdentifiers
preReleaseIdentifiers =
    forall a. a -> a
id

class AsPreReleaseIdentifiers a where
  _PreReleaseIdentifiers ::
    Prism' a PreReleaseIdentifiers

instance AsPreReleaseIdentifiers PreReleaseIdentifiers where
  _PreReleaseIdentifiers :: Prism' PreReleaseIdentifiers PreReleaseIdentifiers
_PreReleaseIdentifiers =
    forall a. a -> a
id

instance PreReleaseIdentifiers ~ t => Rewrapped PreReleaseIdentifiers t

instance Wrapped PreReleaseIdentifiers where
  type Unwrapped PreReleaseIdentifiers = NonEmpty PreReleaseIdentifier
  _Wrapped' :: Iso' PreReleaseIdentifiers (Unwrapped PreReleaseIdentifiers)
_Wrapped' =
    forall s a b t. (s -> a) -> (b -> t) -> Iso s t a b
iso
      (\(PreReleaseIdentifiers NonEmpty PreReleaseIdentifier
x) -> NonEmpty PreReleaseIdentifier
x)
      NonEmpty PreReleaseIdentifier -> PreReleaseIdentifiers
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 :: forall (p :: * -> *). CharParsing p => p PreReleaseIdentifiers
parsePreReleaseIdentifiers =
  NonEmpty PreReleaseIdentifier -> PreReleaseIdentifiers
PreReleaseIdentifiers forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall (m :: * -> *) a sep.
Alternative m =>
m a -> m sep -> m (NonEmpty a)
sepByNonEmpty forall (p :: * -> *). CharParsing p => p PreReleaseIdentifier
parsePreReleaseIdentifier (forall (m :: * -> *). CharParsing m => Char -> m Char
char Char
'.')