imp-1.0.1.0: source/library/Imp/Type/Alias.hs
module Imp.Type.Alias where
import qualified Control.Monad as Monad
import qualified Control.Monad.Catch as Exception
import qualified Data.Map as Map
import qualified Imp.Exception.InvalidAlias as InvalidAlias
import qualified Imp.Type.Source as Source
import qualified Imp.Type.Target as Target
data Alias = Alias
{ source :: Source.Source,
target :: Target.Target
}
deriving (Eq, Show)
fromString :: (Exception.MonadThrow m) => String -> m Alias
fromString string = do
let (before, after) = break (== ':') string
Monad.when (null after) . Exception.throwM $ InvalidAlias.new string
src <- Source.fromString before
tgt <- Target.fromString . drop 1 $ after
pure Alias {source = src, target = tgt}
toMap :: [Alias] -> Map.Map Target.Target Source.Source
toMap = Map.fromListWith (const id) . fmap (\x -> (target x, source x))