packages feed

imp-1.0.2.0: source/library/Imp/Type/Package.hs

module Imp.Type.Package where

import qualified Control.Monad as Monad
import qualified Control.Monad.Catch as Exception
import qualified Data.Map as Map
import qualified Imp.Exception.InvalidPackage as InvalidPackage
import qualified Imp.Type.PackageName as PackageName
import qualified Imp.Type.Target as Target

data Package = Package
  { module_ :: Target.Target,
    package :: PackageName.PackageName
  }
  deriving (Eq, Show)

fromString :: (Exception.MonadThrow m) => String -> m Package
fromString string = do
  let (before, after) = break (== ':') string
  Monad.when (null after) . Exception.throwM $ InvalidPackage.new string
  mdl <- Target.fromString before
  pkg <- PackageName.fromString . drop 1 $ after
  pure Package {module_ = mdl, package = pkg}

toMap :: [Package] -> Map.Map Target.Target PackageName.PackageName
toMap = Map.fromListWith (const id) . fmap (\x -> (module_ x, package x))