{-# OPTIONS_GHC -Wall #-} {-# LANGUAGE TypeFamilies #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE MultiParamTypeClasses #-} module Data.SemanticVersion.IdentifierCharacters where import Control.Lens hiding (cons) import Data.List.NonEmpty import Data.SemanticVersion.IdentifierCharacter import Text.Parser.Char -- $setup -- >>> import Text.Parsec(parse) -- >>> import Data.Either(isLeft) -- ::= -- | newtype IdentifierCharacters = IdentifierCharacters (NonEmpty IdentifierCharacter) deriving (Eq, Show) class HasIdentifierCharacters a where identifierCharacters :: Lens' a IdentifierCharacters instance HasIdentifierCharacters IdentifierCharacters where identifierCharacters = id class AsIdentifierCharacters a where _IdentifierCharacters :: Prism' a IdentifierCharacters instance AsIdentifierCharacters IdentifierCharacters where _IdentifierCharacters = id instance IdentifierCharacters ~ t => Rewrapped IdentifierCharacters t instance Wrapped IdentifierCharacters where type Unwrapped IdentifierCharacters = NonEmpty IdentifierCharacter _Wrapped' = iso (\(IdentifierCharacters x) -> x) IdentifierCharacters -- | -- -- >>> parse (parseIdentifierCharacters <* eof) "parseIdentifierCharacters" "a" -- Right (IdentifierCharacters (IdentifierCharacterNonDigit (NonDigitLetter (AlphaLower Lower_a)) :| [])) -- -- >>> isLeft (parse parseIdentifierCharacters "parseIdentifierCharacters" "") -- True -- -- >>> parse (parseIdentifierCharacters <* eof) "parseIdentifierCharacters" "0" -- Right (IdentifierCharacters (IdentifierCharacterDigit DecDigit0 :| [])) -- -- >>> parse (parseIdentifierCharacters <* eof) "parseIdentifierCharacters" "Abc" -- Right (IdentifierCharacters (IdentifierCharacterNonDigit (NonDigitLetter (AlphaUpper Upper_A)) :| [IdentifierCharacterNonDigit (NonDigitLetter (AlphaLower Lower_b)),IdentifierCharacterNonDigit (NonDigitLetter (AlphaLower Lower_c))])) -- -- >>> parse (parseIdentifierCharacters <* eof) "parseIdentifierCharacters" "-" -- Right (IdentifierCharacters (IdentifierCharacterNonDigit NonDigitHyphen :| [])) -- -- >>> parse (parseIdentifierCharacters <* eof) "parseIdentifierCharacters" "Abc-123" -- Right (IdentifierCharacters (IdentifierCharacterNonDigit (NonDigitLetter (AlphaUpper Upper_A)) :| [IdentifierCharacterNonDigit (NonDigitLetter (AlphaLower Lower_b)),IdentifierCharacterNonDigit (NonDigitLetter (AlphaLower Lower_c)),IdentifierCharacterNonDigit NonDigitHyphen,IdentifierCharacterDigit DecDigit1,IdentifierCharacterDigit DecDigit2,IdentifierCharacterDigit DecDigit3])) -- -- >>> parse (parseIdentifierCharacters <* eof) "parseIdentifierCharacters" "Ab-c-12--3" -- Right (IdentifierCharacters (IdentifierCharacterNonDigit (NonDigitLetter (AlphaUpper Upper_A)) :| [IdentifierCharacterNonDigit (NonDigitLetter (AlphaLower Lower_b)),IdentifierCharacterNonDigit NonDigitHyphen,IdentifierCharacterNonDigit (NonDigitLetter (AlphaLower Lower_c)),IdentifierCharacterNonDigit NonDigitHyphen,IdentifierCharacterDigit DecDigit1,IdentifierCharacterDigit DecDigit2,IdentifierCharacterNonDigit NonDigitHyphen,IdentifierCharacterNonDigit NonDigitHyphen,IdentifierCharacterDigit DecDigit3])) -- -- >>> parse parseIdentifierCharacters "parseIdentifierCharacters" "ABC+" -- Right (IdentifierCharacters (IdentifierCharacterNonDigit (NonDigitLetter (AlphaUpper Upper_A)) :| [IdentifierCharacterNonDigit (NonDigitLetter (AlphaUpper Upper_B)),IdentifierCharacterNonDigit (NonDigitLetter (AlphaUpper Upper_C))])) -- -- >>> isLeft (parse parseIdentifierCharacters "parseIdentifierCharacters" "+") -- True parseIdentifierCharacters :: CharParsing p => p IdentifierCharacters parseIdentifierCharacters = IdentifierCharacters <$> some1 parseIdentifierCharacter