Copyright | (c) 2021 berberman |
---|---|
License | MIT |
Maintainer | berberman <berberman@yandex.com> |
Stability | experimental |
Portability | portable |
Safe Haskell | None |
Language | Haskell2010 |
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
- data PackageSetF f
- type PackageSet = Free PackageSetF
- newPackage :: PackageName -> VersionSource -> PackageFetcher -> PackageSet ()
- purePackageSet :: [Package] -> PackageSet ()
- runPackageSet :: PackageSet () -> IO (HashMap PackageKey Package)
- class PkgDSL f where
- new :: f PackageName -> f (Prod '[PackageName])
- andThen :: f (Prod r) -> f a -> f (Prod (a ': r))
- end :: (Member PackageName r, Member VersionSource r, Member PackageFetcher r) => f (Prod r) -> f ()
- define :: (Member PackageName r, Member VersionSource r, Member PackageFetcher r) => PackageSet (Prod r) -> PackageSet ()
- package :: PackageName -> PackageSet (Prod '[PackageName])
- src :: PackageSet (Prod r) -> VersionSource -> PackageSet (Prod (VersionSource ': r))
- fetch :: PackageSet (Prod r) -> PackageFetcher -> PackageSet (Prod (PackageFetcher ': r))
- fromGitHub :: PackageSet (Prod r) -> (Text, Text) -> PackageSet (Prod (PackageFetcher ': (VersionSource ': r)))
- fromPypi :: PackageSet (Prod r) -> Text -> PackageSet (Prod (PackageFetcher ': (VersionSource ': r)))
- sourceGitHub :: PackageSet (Prod r) -> (Text, Text) -> PackageSet (Prod (VersionSource ': r))
- sourceGit :: PackageSet (Prod r) -> Text -> PackageSet (Prod (VersionSource ': r))
- sourcePypi :: PackageSet (Prod r) -> Text -> PackageSet (Prod (VersionSource ': r))
- sourceAur :: PackageSet (Prod r) -> Text -> PackageSet (Prod (VersionSource ': r))
- sourceArchLinux :: PackageSet (Prod r) -> Text -> PackageSet (Prod (VersionSource ': r))
- sourceManual :: PackageSet (Prod r) -> Text -> PackageSet (Prod (VersionSource ': r))
- sourceRepology :: PackageSet (Prod r) -> (Text, Text) -> PackageSet (Prod (VersionSource ': r))
- fetchGitHub :: PackageSet (Prod r) -> (Text, Text) -> PackageSet (Prod (PackageFetcher ': r))
- fetchGitHubRelease :: PackageSet (Prod r) -> (Text, Text, Text) -> PackageSet (Prod (PackageFetcher ': r))
- fetchPypi :: PackageSet (Prod r) -> Text -> PackageSet (Prod (PackageFetcher ': r))
- fetchGit :: PackageSet (Prod r) -> Text -> PackageSet (Prod (PackageFetcher ': r))
- fetchUrl :: PackageSet (Prod r) -> (Version -> Text) -> PackageSet (Prod (PackageFetcher ': r))
- data Prod (r :: [Type])
- class Member (a :: Type) (r :: [Type])
- type family NotElem (x :: Type) (xs :: [Type]) :: Constraint where ...
- coerce :: forall (k :: RuntimeRep) (a :: TYPE k) (b :: TYPE k). Coercible a b => a -> b
- liftIO :: MonadIO m => IO a -> m a
Package set
data PackageSetF f Source #
Atomic terms of package set
Instances
Functor PackageSetF Source # | |
Defined in NvFetcher.PackageSet fmap :: (a -> b) -> PackageSetF a -> PackageSetF b # (<$) :: a -> PackageSetF b -> PackageSetF a # | |
MonadIO PackageSet Source # | |
Defined in NvFetcher.PackageSet liftIO :: IO a -> PackageSet a # | |
PkgDSL PackageSet Source # | |
Defined in NvFetcher.PackageSet new :: PackageSet PackageName -> PackageSet (Prod '[PackageName]) Source # andThen :: forall (r :: [Type]) a. PackageSet (Prod r) -> PackageSet a -> PackageSet (Prod (a ': r)) Source # end :: forall (r :: [Type]). (Member PackageName r, Member VersionSource r, Member PackageFetcher r) => PackageSet (Prod r) -> PackageSet () Source # |
type PackageSet = Free PackageSetF Source #
Package set is a monad equipped with two capabilities:
- Carry defined packages
- 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
A tagless final style DSL for constructing packages
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
PkgDSL PackageSet Source # | |
Defined in NvFetcher.PackageSet new :: PackageSet PackageName -> PackageSet (Prod '[PackageName]) Source # andThen :: forall (r :: [Type]) a. PackageSet (Prod r) -> PackageSet a -> PackageSet (Prod (a ': r)) Source # end :: forall (r :: [Type]). (Member PackageName r, Member VersionSource r, Member PackageFetcher r) => PackageSet (Prod r) -> PackageSet () Source # |
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
fetch :: PackageSet (Prod r) -> PackageFetcher -> PackageSet (Prod (PackageFetcher ': r)) Source #
Attach fetchers
Two-in-one functions
fromGitHub :: PackageSet (Prod r) -> (Text, Text) -> PackageSet (Prod (PackageFetcher ': (VersionSource ': r))) Source #
A synonym of fetchGitHub
and sourceGitHub
fromPypi :: PackageSet (Prod r) -> Text -> PackageSet (Prod (PackageFetcher ': (VersionSource ': r))) Source #
A synonym of fetchPypi
and sourcePypi
Version sources
:: PackageSet (Prod r) | |
-> (Text, Text) | owner and repo |
-> PackageSet (Prod (VersionSource ': r)) |
This package follows the latest github release
:: PackageSet (Prod r) | |
-> Text | git url |
-> PackageSet (Prod (VersionSource ': r)) |
This package follows the latest git commit
:: PackageSet (Prod r) | |
-> Text | pypi name |
-> PackageSet (Prod (VersionSource ': r)) |
This package follows the latest pypi release
:: PackageSet (Prod r) | |
-> Text | package name in Aur |
-> PackageSet (Prod (VersionSource ': r)) |
This package follows the version of an Aur package
:: 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
:: PackageSet (Prod r) | |
-> (Text, Text) | repology project name and repo |
-> PackageSet (Prod (VersionSource ': r)) |
This package follows the version of a repology package
Fetchers
:: PackageSet (Prod r) | |
-> (Text, Text) | owner and repo |
-> PackageSet (Prod (PackageFetcher ': r)) |
This package is fetched from a github repo
:: 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
:: PackageSet (Prod r) | |
-> Text | pypi name |
-> PackageSet (Prod (PackageFetcher ': r)) |
This package is fetched from pypi
:: PackageSet (Prod r) | |
-> Text | git url |
-> PackageSet (Prod (PackageFetcher ': r)) |
This package is fetched from git
:: PackageSet (Prod r) | |
-> (Version -> Text) | url, given a specific version |
-> PackageSet (Prod (PackageFetcher ': r)) |
This package is fetched from url
Miscellaneous
class Member (a :: Type) (r :: [Type]) Source #
Project elements from Prod
proj
Instances
(TypeError ('ShowType x :<>: 'Text " is undefined") :: Constraint) => Member x ('[] :: [Type]) Source # | |
Defined in NvFetcher.PackageSet | |
Member x xs => Member x (_y ': xs) Source # | |
Defined in NvFetcher.PackageSet | |
NotElem x xs => Member x (x ': xs) Source # | |
Defined in NvFetcher.PackageSet |
type family NotElem (x :: Type) (xs :: [Type]) :: Constraint where ... Source #
Constraint for producing error messages
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
.