packages feed

language-dickinson-0.1.0.0: src/Language/Dickinson/Import.hs

module Language.Dickinson.Import ( resolveImport
                                 ) where

import           Control.Monad           (filterM)
import           Control.Monad.IO.Class  (MonadIO (..))
import           Data.Maybe              (listToMaybe)
import           Data.Semigroup          ((<>))
import qualified Data.Text               as T
import           Language.Dickinson.Name
import           System.Directory        (doesFileExist)
import           System.FilePath         ((</>))

-- TODO: dependency analysis

-- | The canonical way of resolving imports from a name.
--
-- Returns 'Nothing' if no such file exists.
resolveImport :: MonadIO m
              => [FilePath] -- ^ Places to look
              -> Name a
              -> m (Maybe FilePath)
resolveImport incl n = liftIO
    . fmap listToMaybe
    . filterM doesFileExist
    . fmap (</> getFileName n) $ incl

getFileName :: Name a -> FilePath
getFileName = (<> ".dck") . foldr (</>) mempty . fmap T.unpack . name