module Install.Plan where
import qualified Data.Map as Map
import qualified Elm.Package.Solution as S
import qualified Elm.Package.Name as N
import qualified Elm.Package.Version as V
data Plan = Plan
{ installs :: Map.Map N.Name V.Version
, upgrades :: Map.Map N.Name (V.Version, V.Version)
, removals :: Map.Map N.Name V.Version
}
create :: S.Solution -> S.Solution -> Plan
create old new =
Plan
{ installs = Map.difference new old
, upgrades = discardNoOps (Map.intersectionWith (,) old new)
, removals = Map.difference old new
}
where
discardNoOps updates =
Map.mapMaybe isChanged updates
isChanged upgrade@(oldVersion,newVersion) =
if oldVersion == newVersion
then Nothing
else Just upgrade
isEmpty :: Plan -> Bool
isEmpty (Plan installs upgrades removals) =
Map.null installs
&& Map.null upgrades
&& Map.null removals
display :: Plan -> String
display (Plan installs upgrades removals) =
"\n"
++ displayCategory "Install" displayInstall installs
++ displayCategory "Upgrade" displayUpgrade upgrades
++ displayCategory "Remove" displayRemove removals
where
displayCategory name render category =
if Map.null category then "" else
" " ++ name ++ ":"
++ concatMap (\entry -> "\n " ++ render entry) (Map.toList category)
++ "\n"
displayInstall (name, version) =
N.toString name ++ " " ++ V.toString version
displayUpgrade (name, (old, new)) =
N.toString name ++ " (" ++ V.toString old ++ " => " ++ V.toString new ++ ")"
displayRemove (name, _version) =
N.toString name