{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
module StackageToHackage.Stackage.Types where
import Data.List.NonEmpty (NonEmpty(..))
import Data.Map.Strict (Map)
import Data.Semigroup
import Data.Text (Text)
import Distribution.Types.PackageId (PackageIdentifier(..))
import Prelude hiding (head, reverse, takeWhile)
data Stack = Stack
{ resolver :: ResolverRef
, compiler :: Maybe Ghc
, packages :: [Package]
, extraDeps :: [Dep]
, flags :: Flags
, ghcOptions :: GhcOptions
} deriving (Show)
newtype Ghc = Ghc Text
deriving (Show)
data Package = Local FilePath
| Location Git
deriving (Show)
data Git = Git
{ repo :: Repo
, commit :: Commit
, subdirs :: [Subdir]
} deriving (Show, Eq, Ord)
type Repo = Text
type Commit = Text
type Subdir = Text
data Dep = Hackage PkgId
| SourceDep Git
| LocalDep FilePath
deriving (Show)
newtype Flags = Flags (Map PkgName (Map FlagName Bool))
deriving (Show)
deriving newtype (Semigroup, Monoid)
newtype PackageGhcOpts = PackageGhcOpts (Map PkgId GhcFlags)
deriving (Show)
deriving newtype (Semigroup, Monoid)
data GhcOptions = GhcOptions
{ locals :: Maybe GhcFlags
, targets :: Maybe GhcFlags
, everything :: Maybe GhcFlags
, packagesGhcOpts :: PackageGhcOpts
} deriving (Show)
emptyGhcOptions :: GhcOptions
emptyGhcOptions = GhcOptions Nothing Nothing Nothing mempty
type PkgName = Text
type FlagName = Text
type GhcFlags = Text
newtype NewDep = NewDep PkgId deriving (Show)
newtype PkgId = PkgId { unPkgId :: PackageIdentifier } deriving (Show, Ord, Eq)
data NewResolver = NewResolver
{ compiler :: Ghc
, packages :: [NewDep]
, flags :: Flags
} deriving (Show)
data Resolver = Resolver
{ resolver :: Maybe ResolverRef
, compiler :: Maybe Ghc
, deps :: [Dep]
, flags :: Flags
} deriving (Show)
data ResolverRef = Canned Text
| Snapshot Text
deriving (Show)
type RelativeResolvers = NonEmpty (Maybe FilePath, Resolver)
type Resolvers = NonEmpty Resolver