packages feed

imp-0.2024.3.18: 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 GHC.Plugins as Plugin
import qualified Imp.Exception.InvalidAlias as InvalidAlias
import qualified Imp.Extra.ModuleName as ModuleName

data Alias = Alias
  { source :: Plugin.ModuleName,
    target :: Plugin.ModuleName
  }
  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 <- ModuleName.fromString before
  tgt <- ModuleName.fromString . drop 1 $ after
  pure Alias {source = src, target = tgt}

toMap :: [Alias] -> Map.Map Plugin.ModuleName Plugin.ModuleName
toMap = Map.fromListWith (const id) . fmap (\x -> (target x, source x))