packages feed

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))