semantic-version-0.0.1: src/Data/SemanticVersion/IdentifierCharacters.hs
{-# 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)
-- <identifier characters> ::= <identifier character>
-- | <identifier character> <identifier characters>
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