packages feed

horizon-spec-0.6: src/Horizon/Spec.hs

{-# LANGUAGE DeriveAnyClass        #-}
{-# LANGUAGE DuplicateRecordFields #-}
module Horizon.Spec
  ( CabalFlag(MkCabalFlag)
  , Compiler(MkCompiler, fromCompiler)
  , Flag(Enable, Disable)
  , GitSource(MkGitSource, url, revision, subdir)
  , HackageSource(MkHackageSource, name, version)
  , HaskellPackage(MkHaskellPackage, source, modifiers, flags)
  , HaskellSource(FromGit, FromHackage, FromTarball, FromLocal)
  , HorizonExport(MakePackageSet, MakeOverlay)
  , LocalSource(MkLocalSource, fromLocalSource)
  , Modifiers(doJailbreak, doBenchmark, doCheck, enableProfiling, includeBenchmarks, includeExecutables, includeTests)
  , Name(MkName, fromName)
  , OverlayExportSettings(MkOverlayExportSettings, packagesDir, overlayFile, overlay)
  , OverlayFile(MkOverlayFile, fromOverlayFile)
  , Overlay(MkOverlay, fromOverlay)
  , PackageList(MkPackageList, fromPackageList)
  , PackageSetExportSettings(MkPackageSetExportSettings, packagesDir, packageSetFile, packageSet)
  , PackageSetFile(MkPackageSetFile, fromPackageSetFile)
  , PackageSet(MkPackageSet, compiler, packages)
  , PackagesDir(MkPackagesDir, fromPackagesDir)
  , Repo(MkRepo, fromRepo)
  , Revision(MkRevision, fromRevision)
  , Subdir(MkSubdir, fromSubdir)
  , TarballSource(MkTarballSource, fromTarballSource)
  , Url(MkUrl, fromUrl)
  , Version (MkVersion, fromVersion)
  )
  where

import           Data.Kind  (Type)
import           Data.Map   (Map)
import           Data.Text  (Text)
import           Dhall      (FromDhall, Generic, ToDhall)
import           Path       (Dir, File, Path, Rel)
import           Path.Dhall ()


type Url :: Type
newtype Url = MkUrl { fromUrl :: Text }
  deriving stock (Eq, Show)
  deriving newtype (FromDhall, ToDhall)

type Repo :: Type
newtype Repo = MkRepo { fromRepo :: Url }
  deriving stock (Eq, Show)
  deriving newtype (FromDhall, ToDhall)

type Subdir :: Type
newtype Subdir = MkSubdir { fromSubdir :: Path Rel Dir }
  deriving stock (Eq, Show)
  deriving newtype (FromDhall, ToDhall)

type Name :: Type
newtype Name = MkName { fromName :: Text }
  deriving stock (Eq, Ord, Show)
  deriving newtype (FromDhall, ToDhall)

type Version :: Type
newtype Version = MkVersion { fromVersion :: Text }
  deriving stock (Eq, Show)
  deriving newtype (FromDhall, ToDhall)

type GitSource :: Type
data GitSource where
  MkGitSource :: { url :: Repo, revision :: Revision, subdir :: Maybe Subdir } -> GitSource
  deriving stock (Eq, Show, Generic)
  deriving anyclass (FromDhall, ToDhall)

type HackageSource :: Type
data HackageSource where
  MkHackageSource :: { name :: Name, version :: Version } -> HackageSource
  deriving stock (Eq, Show, Generic)
  deriving anyclass (FromDhall, ToDhall)

type LocalSource :: Type
newtype LocalSource where
  MkLocalSource :: { fromLocalSource :: Subdir } -> LocalSource
  deriving stock (Eq, Show, Generic)
  deriving newtype (FromDhall, ToDhall)

type TarballSource :: Type
newtype TarballSource where
  MkTarballSource :: { fromTarballSource :: Url } -> TarballSource
  deriving stock (Eq, Show, Generic)
  deriving newtype (FromDhall, ToDhall)

type HaskellSource :: Type
data HaskellSource where
  FromGit :: GitSource -> HaskellSource
  FromHackage :: HackageSource -> HaskellSource
  FromLocal :: LocalSource -> HaskellSource
  FromTarball :: TarballSource -> HaskellSource
  deriving stock (Show, Eq, Generic)
  deriving anyclass (FromDhall, ToDhall)

type Flag :: Type -> Type
data Flag a where
  Enable :: a -> Flag a
  Disable :: a -> Flag a
  deriving stock (Show, Eq, Generic)
  deriving anyclass (FromDhall, ToDhall)

type CabalFlag :: Type
data CabalFlag where
  MkCabalFlag :: Flag Text -> CabalFlag
  deriving stock (Show, Eq, Generic)
  deriving anyclass (FromDhall, ToDhall)

type Modifiers :: Type
data Modifiers where
  MkModifiers :: { doBenchmark :: Bool
                 , doCheck :: Bool
                 , doJailbreak :: Bool
                 , enableProfiling :: Bool
                 , includeBenchmarks :: Bool
                 , includeExecutables :: Bool
                 , includeTests :: Bool } -> Modifiers
  deriving stock (Show, Eq, Generic)
  deriving anyclass (FromDhall, ToDhall)

type HaskellPackage :: Type
data HaskellPackage where
  MkHaskellPackage :: { source :: HaskellSource
                      , modifiers :: Modifiers
                      , flags :: [CabalFlag] } -> HaskellPackage
  deriving stock (Show, Eq, Generic)
  deriving anyclass (FromDhall, ToDhall)

type Revision :: Type
newtype Revision where
  MkRevision :: { fromRevision :: Text } -> Revision
  deriving stock (Show, Eq, Generic)
  deriving newtype (FromDhall, ToDhall)

type Compiler :: Type
newtype Compiler where
  MkCompiler :: { fromCompiler :: Text } -> Compiler
  deriving stock (Show, Eq, Generic)
  deriving newtype (FromDhall, ToDhall)

type PackageList :: Type
newtype PackageList where
  MkPackageList :: { fromPackageList :: Map Name HaskellPackage } -> PackageList
  deriving stock (Show, Eq, Generic)
  deriving newtype (FromDhall, ToDhall)

type Overlay :: Type
newtype Overlay where
  MkOverlay :: { fromOverlay :: PackageSet } -> Overlay
  deriving stock (Show, Eq, Generic)
  deriving newtype (FromDhall, ToDhall)

type PackageSet :: Type
data PackageSet where
  MkPackageSet :: { compiler :: Compiler
                  , packages :: PackageList } -> PackageSet
  deriving stock (Show, Eq, Generic)
  deriving anyclass (FromDhall, ToDhall)

type PackagesDir :: Type
newtype PackagesDir where
  MkPackagesDir :: { fromPackagesDir :: Path Rel Dir } -> PackagesDir
  deriving stock (Show, Eq, Generic)
  deriving newtype (FromDhall, ToDhall)

type PackageSetFile :: Type
newtype PackageSetFile where
  MkPackageSetFile :: { fromPackageSetFile :: Path Rel File } -> PackageSetFile
  deriving stock (Show, Eq, Generic)
  deriving newtype (FromDhall, ToDhall)

type OverlayFile :: Type
newtype OverlayFile where
  MkOverlayFile :: { fromOverlayFile :: Path Rel File } -> OverlayFile
  deriving stock (Show, Eq, Generic)
  deriving newtype (FromDhall, ToDhall)

type PackageSetExportSettings :: Type
data PackageSetExportSettings where
  MkPackageSetExportSettings :: { packagesDir :: PackagesDir
                                , packageSetFile :: PackageSetFile
                                , packageSet :: PackageSet } -> PackageSetExportSettings
  deriving stock (Show, Eq, Generic)
  deriving anyclass (FromDhall, ToDhall)

type OverlayExportSettings :: Type
data OverlayExportSettings where
  MkOverlayExportSettings :: { packagesDir :: PackagesDir
                             , overlayFile :: OverlayFile
                             , overlay :: Overlay } -> OverlayExportSettings
  deriving stock (Show, Eq, Generic)
  deriving anyclass (FromDhall, ToDhall)

type HorizonExport :: Type
data HorizonExport where
  MakePackageSet :: PackageSetExportSettings -> HorizonExport
  MakeOverlay :: OverlayExportSettings -> HorizonExport
  deriving stock (Show, Eq, Generic)
  deriving anyclass (FromDhall, ToDhall)