{-# LANGUAGE GeneralizedNewtypeDeriving #-}
-- |
-- Module: Staversion.Internal.BuildPlan.BuildPlanMap
-- Description: BuildPlanMap type and related symbols.
-- Maintainer: Toshio Ito <debug.ito@gmail.com>
--
-- __This is an internal module. End-users should not use it.__
--
-- @since 0.2.4.0
module Staversion.Internal.BuildPlan.BuildPlanMap
  ( BuildPlanMap,
    fromMap,
    fromList,
    toList,
    HasVersions(..)
  ) where

import Control.Applicative (empty, (<$>), (<*>))
import qualified Data.HashMap.Strict as HM
import Data.Monoid (Monoid, (<>), mconcat)
import Data.Semigroup (Semigroup)

import Staversion.Internal.Query
 ( PackageName
 )
import Staversion.Internal.Version (Version)

-- | A data structure that keeps a map between package names and their
-- versions.
newtype BuildPlanMap = BuildPlanMap (HM.HashMap PackageName Version) deriving (b -> BuildPlanMap -> BuildPlanMap
NonEmpty BuildPlanMap -> BuildPlanMap
BuildPlanMap -> BuildPlanMap -> BuildPlanMap
(BuildPlanMap -> BuildPlanMap -> BuildPlanMap)
-> (NonEmpty BuildPlanMap -> BuildPlanMap)
-> (forall b. Integral b => b -> BuildPlanMap -> BuildPlanMap)
-> Semigroup BuildPlanMap
forall b. Integral b => b -> BuildPlanMap -> BuildPlanMap
forall a.
(a -> a -> a)
-> (NonEmpty a -> a)
-> (forall b. Integral b => b -> a -> a)
-> Semigroup a
stimes :: b -> BuildPlanMap -> BuildPlanMap
$cstimes :: forall b. Integral b => b -> BuildPlanMap -> BuildPlanMap
sconcat :: NonEmpty BuildPlanMap -> BuildPlanMap
$csconcat :: NonEmpty BuildPlanMap -> BuildPlanMap
<> :: BuildPlanMap -> BuildPlanMap -> BuildPlanMap
$c<> :: BuildPlanMap -> BuildPlanMap -> BuildPlanMap
Semigroup,Semigroup BuildPlanMap
BuildPlanMap
Semigroup BuildPlanMap
-> BuildPlanMap
-> (BuildPlanMap -> BuildPlanMap -> BuildPlanMap)
-> ([BuildPlanMap] -> BuildPlanMap)
-> Monoid BuildPlanMap
[BuildPlanMap] -> BuildPlanMap
BuildPlanMap -> BuildPlanMap -> BuildPlanMap
forall a.
Semigroup a -> a -> (a -> a -> a) -> ([a] -> a) -> Monoid a
mconcat :: [BuildPlanMap] -> BuildPlanMap
$cmconcat :: [BuildPlanMap] -> BuildPlanMap
mappend :: BuildPlanMap -> BuildPlanMap -> BuildPlanMap
$cmappend :: BuildPlanMap -> BuildPlanMap -> BuildPlanMap
mempty :: BuildPlanMap
$cmempty :: BuildPlanMap
$cp1Monoid :: Semigroup BuildPlanMap
Monoid,Int -> BuildPlanMap -> ShowS
[BuildPlanMap] -> ShowS
BuildPlanMap -> String
(Int -> BuildPlanMap -> ShowS)
-> (BuildPlanMap -> String)
-> ([BuildPlanMap] -> ShowS)
-> Show BuildPlanMap
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [BuildPlanMap] -> ShowS
$cshowList :: [BuildPlanMap] -> ShowS
show :: BuildPlanMap -> String
$cshow :: BuildPlanMap -> String
showsPrec :: Int -> BuildPlanMap -> ShowS
$cshowsPrec :: Int -> BuildPlanMap -> ShowS
Show,BuildPlanMap -> BuildPlanMap -> Bool
(BuildPlanMap -> BuildPlanMap -> Bool)
-> (BuildPlanMap -> BuildPlanMap -> Bool) -> Eq BuildPlanMap
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: BuildPlanMap -> BuildPlanMap -> Bool
$c/= :: BuildPlanMap -> BuildPlanMap -> Bool
== :: BuildPlanMap -> BuildPlanMap -> Bool
$c== :: BuildPlanMap -> BuildPlanMap -> Bool
Eq)

fromMap :: HM.HashMap PackageName Version -> BuildPlanMap
fromMap :: HashMap PackageName Version -> BuildPlanMap
fromMap = HashMap PackageName Version -> BuildPlanMap
BuildPlanMap

fromList :: [(PackageName, Version)] -> BuildPlanMap
fromList :: [(PackageName, Version)] -> BuildPlanMap
fromList = HashMap PackageName Version -> BuildPlanMap
BuildPlanMap (HashMap PackageName Version -> BuildPlanMap)
-> ([(PackageName, Version)] -> HashMap PackageName Version)
-> [(PackageName, Version)]
-> BuildPlanMap
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [(PackageName, Version)] -> HashMap PackageName Version
forall k v. (Eq k, Hashable k) => [(k, v)] -> HashMap k v
HM.fromList

toList :: BuildPlanMap -> [(PackageName, Version)]
toList :: BuildPlanMap -> [(PackageName, Version)]
toList (BuildPlanMap HashMap PackageName Version
m) = HashMap PackageName Version -> [(PackageName, Version)]
forall k v. HashMap k v -> [(k, v)]
HM.toList HashMap PackageName Version
m

-- | Types that have mapping between 'PackageName' and 'Version'.
class HasVersions t where
  packageVersion :: t -> PackageName -> Maybe Version

instance HasVersions BuildPlanMap where
  packageVersion :: BuildPlanMap -> PackageName -> Maybe Version
packageVersion (BuildPlanMap HashMap PackageName Version
bp_map) PackageName
name = PackageName -> HashMap PackageName Version -> Maybe Version
forall k v. (Eq k, Hashable k) => k -> HashMap k v -> Maybe v
HM.lookup PackageName
name HashMap PackageName Version
bp_map