packages feed

source-constraints-0.0.1: src/SourceConstraints/LocalModule.hs

module SourceConstraints.LocalModule
  ( LocalModule(..)
  , isLocalModule
  , localModuleParser
  )
where

import Control.Applicative
import Data.Attoparsec.Text
import Data.Bool
import Data.Char
import Data.Eq
import Data.Function
import Data.Semigroup
import Data.List
import Module

newtype LocalModule = LocalModule ModuleName

localModuleParser :: Parser LocalModule
localModuleParser = LocalModule <$> (string "local:" *> moduleNameParser)

moduleNameParser :: Parser ModuleName
moduleNameParser = do
  first  <- section
  others <- many (char '.' *> section)

  pure . mkModuleName $ first <> intercalate "." others
  where
    section = (:) <$> satisfy isUpper <*> many (satisfy isLower)

isLocalModule :: LocalModule -> ModuleName -> Bool
isLocalModule (LocalModule localModuleName) moduleName =
  localModuleName == moduleName || prefixMatch
    where
      prefixMatch =
        (moduleNameString localModuleName <> ".")
        `isPrefixOf`
        moduleNameString moduleName