packages feed

moonlight-core-0.1.0.0: src-basis/Moonlight/Core/ModuleIdentifier.hs

-- | Predicates and splitting for qualified module names (dot-separated,
-- upper-initial segments).
module Moonlight.Core.ModuleIdentifier
  ( isQualifiedModuleName,
    isCompactName,
    isModuleSegment,
    isModuleSegmentCharacter,
    splitModuleName,
  )
where

import Data.Char (isAlphaNum, isSpace, isUpper)
import Data.Text (Text)
import qualified Data.Text as Text
import Prelude

isQualifiedModuleName :: Text -> Bool
isQualifiedModuleName candidate =
  isCompactName candidate
    && all isModuleSegment (splitModuleName candidate)

isCompactName :: Text -> Bool
isCompactName candidate =
  not (Text.null candidate) && not (Text.any isSpace candidate)

isModuleSegment :: Text -> Bool
isModuleSegment segment =
  case Text.uncons segment of
    Nothing -> False
    Just (firstCharacter, remainingCharacters) ->
      isUpper firstCharacter && Text.all isModuleSegmentCharacter remainingCharacters

isModuleSegmentCharacter :: Char -> Bool
isModuleSegmentCharacter character =
  isAlphaNum character || character == '_' || character == '\''

splitModuleName :: Text -> [Text]
splitModuleName =
  Text.splitOn (Text.pack ".")