packages feed

semantic-version-0.0.1: src/Data/SemanticVersion/BuildIdentifiers.hs

{-# 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)

-- <dot-separated build identifiers> ::= <build identifier>
--                                     | <build identifier> "." <dot-separated build identifiers>
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 '.')