{-# LANGUAGE DeriveGeneric  #-}
{-# LANGUAGE DeriveFunctor  #-}
{-# LANGUAGE FlexibleInstances  #-}
{-# LANGUAGE KindSignatures  #-}

-- | Shared types

module Nix.Derivation.Types
    ( -- * Types
      Derivation(..)
    , DerivationOutput(..)
    ) where

import Control.DeepSeq (NFData)
import Data.Map (Map)
import Data.Set (Set)
import Data.Vector (Vector)
import GHC.Generics (Generic)

-- | A Nix derivation
data Derivation fp txt = Derivation
    { outputs   :: Map txt (DerivationOutput fp txt)
    -- ^ Outputs produced by this derivation where keys are output names
    , inputDrvs :: Map fp (Set txt)
    -- ^ Inputs that are derivations where keys specify derivation paths and
    -- values specify which output names are used by this derivation
    , inputSrcs :: Set fp
    -- ^ Inputs that are sources
    , platform  :: txt
    -- ^ Platform required for this derivation
    , builder   :: txt
    -- ^ Code to build the derivation, which can be a path or a builtin function
    , args      :: Vector txt
    -- ^ Arguments passed to the executable used to build to derivation
    , env       :: Map txt txt
    -- ^ Environment variables provided to the executable used to build the
    -- derivation
    } deriving (Eq, Generic, Ord, Show)

instance (NFData a, NFData b) => NFData (Derivation a b)

-- | An output of a Nix derivation
data DerivationOutput fp txt = DerivationOutput
    { path     :: fp
    -- ^ Path where the output will be saved
    , hashAlgo :: txt
    -- ^ Hash used for expected hash computation
    , hash     :: txt
    -- ^ Expected hash
    } deriving (Eq, Generic, Ord, Show)

instance (NFData a, NFData b) => NFData (DerivationOutput a b)