content: {-# 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
  