nvfetcher-0.1.0.0: Generate nix sources expr for the latest version of packages
Copyright(c) 2021 berberman
LicenseMIT
Maintainerberberman <berberman@yandex.com>
Stabilityexperimental
Portabilityportable
Safe HaskellNone
LanguageHaskell2010

NvFetcher.PackageSet

Description

This module mainly contains two things: PackageSet and PkgDSL. NvFetcher accepts the former one -- a set of packages to produce nix sources expr; the later one is used to construct a single package.

There are many combinators for defining packages. See the documentation of define for example.

Synopsis

Package set

data PackageSetF f Source #

Atomic terms of package set

Instances

Instances details
Functor PackageSetF Source # 
Instance details

Defined in NvFetcher.PackageSet

Methods

fmap :: (a -> b) -> PackageSetF a -> PackageSetF b #

(<$) :: a -> PackageSetF b -> PackageSetF a #

MonadIO PackageSet Source # 
Instance details

Defined in NvFetcher.PackageSet

Methods

liftIO :: IO a -> PackageSet a #

PkgDSL PackageSet Source # 
Instance details

Defined in NvFetcher.PackageSet

type PackageSet = Free PackageSetF Source #

Package set is a monad equipped with two capabilities:

  1. Carry defined packages
  2. Run IO actions

Package set is evaluated be for shake runs. Use newPackage to add a new package, liftIO to run an IO action.

newPackage :: PackageName -> VersionSource -> PackageFetcher -> PackageSet () Source #

Add a package to package set

purePackageSet :: [Package] -> PackageSet () Source #

Add a list of packages into package set

runPackageSet :: PackageSet () -> IO (HashMap PackageKey Package) Source #

Run package set into a set of packages

Throws exception as more then one packages with the same name are defined

Package DSL

Primitives

class PkgDSL f where Source #

A tagless final style DSL for constructing packages

Methods

new :: f PackageName -> f (Prod '[PackageName]) Source #

andThen :: f (Prod r) -> f a -> f (Prod (a ': r)) Source #

end :: (Member PackageName r, Member VersionSource r, Member PackageFetcher r) => f (Prod r) -> f () Source #

Instances

Instances details
PkgDSL PackageSet Source # 
Instance details

Defined in NvFetcher.PackageSet

define :: (Member PackageName r, Member VersionSource r, Member PackageFetcher r) => PackageSet (Prod r) -> PackageSet () Source #

PkgDSL version of newPackage

Example:

define $ package "nvfetcher-git" sourceGit "nvfetcher" fetchGitHub ("berberman", "nvfetcher")

package :: PackageName -> PackageSet (Prod '[PackageName]) Source #

Start chaining with the name of package to define

src :: PackageSet (Prod r) -> VersionSource -> PackageSet (Prod (VersionSource ': r)) Source #

Attach version sources

Two-in-one functions

Version sources

sourceGitHub Source #

Arguments

:: PackageSet (Prod r) 
-> (Text, Text)

owner and repo

-> PackageSet (Prod (VersionSource ': r)) 

This package follows the latest github release

sourceGit Source #

Arguments

:: PackageSet (Prod r) 
-> Text

git url

-> PackageSet (Prod (VersionSource ': r)) 

This package follows the latest git commit

sourcePypi Source #

Arguments

:: PackageSet (Prod r) 
-> Text

pypi name

-> PackageSet (Prod (VersionSource ': r)) 

This package follows the latest pypi release

sourceAur Source #

Arguments

:: PackageSet (Prod r) 
-> Text

package name in Aur

-> PackageSet (Prod (VersionSource ': r)) 

This package follows the version of an Aur package

sourceArchLinux Source #

Arguments

:: PackageSet (Prod r) 
-> Text

package name in Arch Linux repo

-> PackageSet (Prod (VersionSource ': r)) 

This package follows the version of an Arch Linux package

sourceManual :: PackageSet (Prod r) -> Text -> PackageSet (Prod (VersionSource ': r)) Source #

This package follows a pinned version

sourceRepology Source #

Arguments

:: PackageSet (Prod r) 
-> (Text, Text)

repology project name and repo

-> PackageSet (Prod (VersionSource ': r)) 

This package follows the version of a repology package

Fetchers

fetchGitHub Source #

Arguments

:: PackageSet (Prod r) 
-> (Text, Text)

owner and repo

-> PackageSet (Prod (PackageFetcher ': r)) 

This package is fetched from a github repo

fetchGitHubRelease Source #

Arguments

:: PackageSet (Prod r) 
-> (Text, Text, Text)

owner, repo, and file name

-> PackageSet (Prod (PackageFetcher ': r)) 

This package is fetched from a file in github release

fetchPypi Source #

Arguments

:: PackageSet (Prod r) 
-> Text

pypi name

-> PackageSet (Prod (PackageFetcher ': r)) 

This package is fetched from pypi

fetchGit Source #

Arguments

:: PackageSet (Prod r) 
-> Text

git url

-> PackageSet (Prod (PackageFetcher ': r)) 

This package is fetched from git

fetchUrl Source #

Arguments

:: PackageSet (Prod r) 
-> (Version -> Text)

url, given a specific version

-> PackageSet (Prod (PackageFetcher ': r)) 

This package is fetched from url

Miscellaneous

data Prod (r :: [Type]) Source #

Simple HList

class Member (a :: Type) (r :: [Type]) Source #

Project elements from Prod

Minimal complete definition

proj

Instances

Instances details
(TypeError ('ShowType x :<>: 'Text " is undefined") :: Constraint) => Member x ('[] :: [Type]) Source # 
Instance details

Defined in NvFetcher.PackageSet

Methods

proj :: Prod '[] -> x

Member x xs => Member x (_y ': xs) Source # 
Instance details

Defined in NvFetcher.PackageSet

Methods

proj :: Prod (_y ': xs) -> x

NotElem x xs => Member x (x ': xs) Source # 
Instance details

Defined in NvFetcher.PackageSet

Methods

proj :: Prod (x ': xs) -> x

type family NotElem (x :: Type) (xs :: [Type]) :: Constraint where ... Source #

Constraint for producing error messages

Equations

NotElem x (x ': xs) = TypeError (ShowType x :<>: 'Text " is defined more than one times") 
NotElem x (_ ': xs) = NotElem x xs 
NotElem x '[] = () 

coerce :: forall (k :: RuntimeRep) (a :: TYPE k) (b :: TYPE k). Coercible a b => a -> b #

The function coerce allows you to safely convert between values of types that have the same representation with no run-time overhead. In the simplest case you can use it instead of a newtype constructor, to go from the newtype's concrete type to the abstract type. But it also works in more complicated settings, e.g. converting a list of newtypes to a list of concrete types.

This function is runtime-representation polymorphic, but the RuntimeRep type argument is marked as Inferred, meaning that it is not available for visible type application. This means the typechecker will accept coerce @Int @Age 42.

liftIO :: MonadIO m => IO a -> m a #

Lift a computation from the IO monad.