Distribution/Types/UnqualComponentName.hs

    {-# LANGUAGE GeneralizedNewtypeDeriving #-}
    {-# LANGUAGE DeriveDataTypeable #-}
    {-# LANGUAGE DeriveGeneric #-}
    module Distribution.Types.UnqualComponentName
      ( UnqualComponentName, unUnqualComponentName, mkUnqualComponentName
      , packageNameToUnqualComponentName, unqualComponentNameToPackageName
      ) where

    import Prelude ()
    import Distribution.Compat.Prelude
    import Distribution.Utils.ShortText

    import Distribution.Text
    import Distribution.ParseUtils (parsePackageName)
    import Distribution.Types.PackageName

    import Text.PrettyPrint (text)

    -- | An unqualified component name, for any kind of component.
    --
    -- This is distinguished from a 'ComponentName' and 'ComponentId'. The former
    -- also states which of a library, executable, etc the name refers too. The
    -- later uniquely identifiers a component and its closure.
    --
    -- @since 2.0
    newtype UnqualComponentName = UnqualComponentName ShortText
      deriving (Generic, Read, Show, Eq, Ord, Typeable, Data,
                Semigroup, Monoid) -- TODO: bad enabler of bad monoids

    -- | Convert 'UnqualComponentName' to 'String'
    --
    -- @since 2.0
    unUnqualComponentName :: UnqualComponentName -> String
    unUnqualComponentName (UnqualComponentName s) = fromShortText s

    -- | Construct a 'UnqualComponentName' from a 'String'
    --
    -- 'mkUnqualComponentName' is the inverse to 'unUnqualComponentName'
    --
    -- Note: No validations are performed to ensure that the resulting
    -- 'UnqualComponentName' is valid
    --
    -- @since 2.0
    mkUnqualComponentName :: String -> UnqualComponentName
    mkUnqualComponentName = UnqualComponentName . toShortText

    -- | 'mkUnqualComponentName'
    --
    -- @since 2.0
    instance IsString UnqualComponentName where
      fromString = mkUnqualComponentName

    instance Binary UnqualComponentName

    instance Text UnqualComponentName where
      disp = text . unUnqualComponentName
      parse = mkUnqualComponentName <$> parsePackageName

    instance NFData UnqualComponentName where
      rnf (UnqualComponentName pkg) = rnf pkg

    -- TODO avoid String round trip with these PackageName <->
    -- UnqualComponentName converters.

    -- | Converts a package name to an unqualified component name
    --
    -- Useful in legacy situations where a package name may refer to an internal
    -- component, if one is defined with that name.
    --
    -- @since 2.0
    packageNameToUnqualComponentName :: PackageName -> UnqualComponentName
    packageNameToUnqualComponentName = mkUnqualComponentName . unPackageName

    -- | Converts an unqualified component name to a package name
    --
    -- `packageNameToUnqualComponentName` is the inverse of
    -- `unqualComponentNameToPackageName`.
    --
    -- Useful in legacy situations where a package name may refer to an internal
    -- component, if one is defined with that name.
    --
    -- @since 2.0
    unqualComponentNameToPackageName :: UnqualComponentName -> PackageName
    unqualComponentNameToPackageName = mkPackageName . unUnqualComponentName