content: module Fay.Types.ModulePath
    ( ModulePath (..)
    , mkModulePath
    , mkModulePaths
    , mkModulePathFromQName
    ) where
  
  import           Fay.Compiler.QName
  import qualified Fay.Exts                        as F
  
  import           Data.List
  import           Data.List.Split
  import           Language.Haskell.Exts
  
  -- | The name of a module split into a list for code generation.
  newtype ModulePath = ModulePath { unModulePath :: [String] }
    deriving (Eq, Ord, Show)
  
  -- | Construct the complete ModulePath from a ModuleName.
  mkModulePath :: ModuleName a -> ModulePath
  mkModulePath (ModuleName _ m) = ModulePath . splitOn "." $ m
  
  -- | Construct intermediate module paths from a ModuleName.
  -- mkModulePaths "A.B" => [["A"], ["A","B"]]
  mkModulePaths :: ModuleName a -> [ModulePath]
  mkModulePaths (ModuleName _ m) = map ModulePath . tail . inits . splitOn "." $ m
  
  -- | Converting a QName to a ModulePath is only relevant for constructors since
  -- they can conflict with module names.
  mkModulePathFromQName :: QName a -> ModulePath
  mkModulePathFromQName (Qual _ (ModuleName _ m) n) = mkModulePath $ ModuleName F.noI $ m ++ "." ++ unname n
  mkModulePathFromQName _ = error "mkModulePathFromQName: Not a qualified name"
  