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

class HasIdentifierCharacters a where
  identifierCharacters ::
    Lens' a IdentifierCharacters

instance HasIdentifierCharacters IdentifierCharacters where
  identifierCharacters :: Lens' IdentifierCharacters IdentifierCharacters
identifierCharacters =
    forall a. a -> a
id

class AsIdentifierCharacters a where
  _IdentifierCharacters ::
    Prism' a IdentifierCharacters

instance AsIdentifierCharacters IdentifierCharacters where
  _IdentifierCharacters :: Prism' IdentifierCharacters IdentifierCharacters
_IdentifierCharacters =
    forall a. a -> a
id

instance IdentifierCharacters ~ t => Rewrapped IdentifierCharacters t

instance Wrapped IdentifierCharacters where
  type Unwrapped IdentifierCharacters = NonEmpty IdentifierCharacter
  _Wrapped' :: Iso' IdentifierCharacters (Unwrapped IdentifierCharacters)
_Wrapped' =
    forall s a b t. (s -> a) -> (b -> t) -> Iso s t a b
iso
      (\(IdentifierCharacters NonEmpty IdentifierCharacter
x) -> NonEmpty IdentifierCharacter
x)
      NonEmpty IdentifierCharacter -> IdentifierCharacters
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 :: forall (p :: * -> *). CharParsing p => p IdentifierCharacters
parseIdentifierCharacters =
  NonEmpty IdentifierCharacter -> IdentifierCharacters
IdentifierCharacters forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall (f :: * -> *) a. Alternative f => f a -> f (NonEmpty a)
some1 forall (p :: * -> *). CharParsing p => p IdentifierCharacter
parseIdentifierCharacter