packages feed

autonix-deps-0.2.0.0: src/Autonix/Deps.hs

{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE Rank2Types #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE ViewPatterns #-}

module Autonix.Deps
       ( Deps, names, deps, rename
       , module Autonix.PkgDeps
       ) where

import Control.Lens
import Control.Monad.State
import qualified Data.Map as M
import Data.Monoid
import Prelude hiding (foldr)

import Autonix.PkgDeps

data Deps =
    Deps { _names :: Map ByteString ByteString
         , _deps :: Map ByteString PkgDeps
         }
  deriving (Read, Show)
makeLenses ''Deps

instance Monoid Deps where
    mempty = Deps { _names = M.empty, _deps = M.empty }

    mappend a b = flip execState a $ do
      let b' = execState (iforMOf_ (names.>itraversed) a rename) b
      iforMOf_ (names.>itraversed) b' rename
      names %= M.union (b'^.names)
      deps %= M.unionWith mappend (b'^.deps)

rename :: (MonadState Deps m) => ByteString -> ByteString -> m ()
rename old new = names %= M.insert old new

type instance Index Deps = ByteString
type instance IxValue Deps = PkgDeps

instance Ixed Deps where
    ix idx = deps . ix idx

instance At Deps where
    at idx = deps . at idx