{-# OPTIONS_GHC -Wall #-} {-# LANGUAGE TypeFamilies #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE MultiParamTypeClasses #-} module Data.SemanticVersion.BuildIdentifiers where import Control.Lens import Data.List.NonEmpty import Data.SemanticVersion.BuildIdentifier import Text.Parser.Char import Text.Parser.Combinators -- $setup -- >>> import Text.Parsec(parse) -- >>> import Data.Either(isLeft) -- ::= -- | "." newtype BuildIdentifiers = BuildIdentifiers (NonEmpty BuildIdentifier) deriving (Eq, Show) class HasBuildIdentifiers a where buildIdentifiers :: Lens' a BuildIdentifiers instance HasBuildIdentifiers BuildIdentifiers where buildIdentifiers = id class AsBuildIdentifiers a where _BuildIdentifiers :: Prism' a BuildIdentifiers instance AsBuildIdentifiers BuildIdentifiers where _BuildIdentifiers = id instance BuildIdentifiers ~ t => Rewrapped BuildIdentifiers t instance Wrapped BuildIdentifiers where type Unwrapped BuildIdentifiers = NonEmpty BuildIdentifier _Wrapped' = iso (\(BuildIdentifiers x) -> x) BuildIdentifiers parseBuildIdentifiers :: CharParsing p => p BuildIdentifiers parseBuildIdentifiers = BuildIdentifiers <$> sepByNonEmpty parseBuildIdentifier (char '.')