module Robotics.ROS.Pkg.Finder (
package
, packageList
) where
import Control.Concurrent.Async (mapConcurrently)
import System.Directory (getDirectoryContents)
import System.Environment (getEnv)
import System.FilePath (joinPath)
import Data.List.Split (splitOn)
import Data.Maybe (listToMaybe)
import Data.Either (rights)
import Data.Text (unpack)
import Robotics.ROS.Pkg.Parser
import Robotics.ROS.Pkg.Types
package :: PkgName -> IO (Maybe Package)
package name = listToMaybe <$> find (const (return [unpack name]))
packageList :: IO [Package]
packageList = find getDirectoryContents
find :: (FilePath -> IO [FilePath]) -> IO [Package]
find content = do
paths <- splitOn ":" <$> getEnv "ROS_PACKAGE_PATH"
concat <$> mapM go paths
where package_xml b d = joinPath [b, d, "package.xml"]
go d = do candidates <- fmap (package_xml d) <$> content d
rights <$> mapConcurrently parse candidates