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 -> NvcheckerQ -> PackageFetcher -> PackageExtractSrc -> Maybe PackageCargoFilePath -> PackageSet ()
- purePackageSet :: [Package] -> PackageSet ()
- runPackageSet :: PackageSet () -> IO (Map 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, OptionalMember PackageExtractSrc r, OptionalMember PackageCargoFilePath r, OptionalMember NvcheckerOptions r) => f (Prod r) -> f ()
- define :: (Member PackageName r, Member VersionSource r, Member PackageFetcher r, OptionalMember PackageExtractSrc r, OptionalMember PackageCargoFilePath r, OptionalMember NvcheckerOptions 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)))
- fromGitHub' :: PackageSet (Prod r) -> (Text, Text, NixFetcher Fresh -> NixFetcher Fresh) -> PackageSet (Prod (PackageFetcher ': (VersionSource ': r)))
- fromGitHubTag :: PackageSet (Prod r) -> (Text, Text, ListOptions -> ListOptions) -> PackageSet (Prod (PackageFetcher ': (VersionSource ': r)))
- fromGitHubTag' :: PackageSet (Prod r) -> (Text, Text, ListOptions -> ListOptions, NixFetcher Fresh -> NixFetcher Fresh) -> 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))
- sourceGitHubTag :: PackageSet (Prod r) -> (Text, Text, ListOptions -> ListOptions) -> PackageSet (Prod (VersionSource ': r))
- sourceGit :: PackageSet (Prod r) -> Text -> PackageSet (Prod (VersionSource ': r))
- sourceGit' :: PackageSet (Prod r) -> (Text, 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))
- sourceWebpage :: PackageSet (Prod r) -> (Text, Text, ListOptions -> ListOptions) -> PackageSet (Prod (VersionSource ': r))
- sourceHttpHeader :: PackageSet (Prod r) -> (Text, Text, ListOptions -> ListOptions) -> PackageSet (Prod (VersionSource ': r))
- fetchGitHub :: PackageSet (Prod r) -> (Text, Text) -> PackageSet (Prod (PackageFetcher ': r))
- fetchGitHub' :: PackageSet (Prod r) -> (Text, Text, NixFetcher Fresh -> NixFetcher Fresh) -> 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))
- fetchGit' :: PackageSet (Prod r) -> (Text, NixFetcher Fresh -> NixFetcher Fresh) -> PackageSet (Prod (PackageFetcher ': r))
- fetchUrl :: PackageSet (Prod r) -> (Version -> Text) -> PackageSet (Prod (PackageFetcher ': r))
- extractSource :: PackageSet (Prod r) -> [FilePath] -> PackageSet (Prod (PackageExtractSrc ': r))
- hasCargoLock :: PackageSet (Prod r) -> FilePath -> PackageSet (Prod (PackageCargoFilePath ': r))
- tweakVersion :: PackageSet (Prod r) -> (NvcheckerOptions -> NvcheckerOptions) -> PackageSet (Prod (NvcheckerOptions ': 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
- (&) :: a -> (a -> b) -> b
- (.~) :: ASetter s t a b -> b -> s -> t
- (%~) :: ASetter s t a b -> (a -> b) -> s -> t
- (^.) :: s -> Getting a s a -> a
- (?~) :: ASetter s t a (Maybe b) -> b -> s -> t
- module NvFetcher.Types.Lens
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, OptionalMember PackageExtractSrc r, OptionalMember PackageCargoFilePath r, OptionalMember NvcheckerOptions 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 -> NvcheckerQ -> PackageFetcher -> PackageExtractSrc -> Maybe PackageCargoFilePath -> PackageSet () Source #
Add a package to package set
purePackageSet :: [Package] -> PackageSet () Source #
Add a list of packages into package set
runPackageSet :: PackageSet () -> IO (Map 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, OptionalMember PackageExtractSrc r, OptionalMember PackageCargoFilePath r, OptionalMember NvcheckerOptions 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, OptionalMember PackageExtractSrc r, OptionalMember PackageCargoFilePath r, OptionalMember NvcheckerOptions r) => PackageSet (Prod r) -> PackageSet () Source # |
define :: (Member PackageName r, Member VersionSource r, Member PackageFetcher r, OptionalMember PackageExtractSrc r, OptionalMember PackageCargoFilePath r, OptionalMember NvcheckerOptions r) => PackageSet (Prod r) -> PackageSet () Source #
PkgDSL
version of newPackage
Example:
define $ package "nvfetcher-git"sourceGit
"https://github.com/berberman/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
fromGitHub' :: PackageSet (Prod r) -> (Text, Text, NixFetcher Fresh -> NixFetcher Fresh) -> PackageSet (Prod (PackageFetcher ': (VersionSource ': r))) Source #
A synonym of fetchGitHub'
and sourceGitHub
fromGitHubTag :: PackageSet (Prod r) -> (Text, Text, ListOptions -> ListOptions) -> PackageSet (Prod (PackageFetcher ': (VersionSource ': r))) Source #
A synonym of fetchGitHub
and sourceGitHubTag
fromGitHubTag' :: PackageSet (Prod r) -> (Text, Text, ListOptions -> ListOptions, NixFetcher Fresh -> NixFetcher Fresh) -> PackageSet (Prod (PackageFetcher ': (VersionSource ': r))) Source #
A synonym of fetchGitHub'
and sourceGitHubTag
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, Text, ListOptions -> ListOptions) | owner, repo, and nvchecker list options to find the target tag |
-> PackageSet (Prod (VersionSource ': r)) |
This package follows the a tag from github
:: PackageSet (Prod r) | |
-> Text | git url |
-> PackageSet (Prod (VersionSource ': r)) |
This package follows the latest git commit
:: PackageSet (Prod r) | |
-> (Text, Text) | git url and branch |
-> PackageSet (Prod (VersionSource ': r)) |
Similar to sourceGit
, but allows to specify branch
:: 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
:: PackageSet (Prod r) | |
-> (Text, Text, ListOptions -> ListOptions) | web page url, regex, and list options |
-> PackageSet (Prod (VersionSource ': r)) |
This package follows a version extracted from web page
:: PackageSet (Prod r) | |
-> (Text, Text, ListOptions -> ListOptions) | url of the http request, regex, and list options |
-> PackageSet (Prod (VersionSource ': r)) |
This package follows a version extracted from http header
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, NixFetcher Fresh -> NixFetcher Fresh) | owner and repo |
-> PackageSet (Prod (PackageFetcher ': r)) |
This package is fetched from a github repo
Similar to fetchGitHub
, but allows a modifier to the fetcher.
For example, you can enable fetch submodules like:
define $ package "qliveplayer"sourceGitHub
(IsoaSFlus, QLivePlayer)fetchGitHub
` (IsoaSFlus, QLivePlayer, fetchSubmodules .~ True)
:: 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) | |
-> (Text, NixFetcher Fresh -> NixFetcher Fresh) | git url |
-> PackageSet (Prod (PackageFetcher ': r)) |
This package is fetched from git
Similar to fetchGit
, but allows a modifier to the fetcher.
See fetchGitHub'
for a concret example.
:: PackageSet (Prod r) | |
-> (Version -> Text) | url, given a specific version |
-> PackageSet (Prod (PackageFetcher ': r)) |
This package is fetched from url
Addons
extractSource :: PackageSet (Prod r) -> [FilePath] -> PackageSet (Prod (PackageExtractSrc ': r)) Source #
Extract files from fetched package source
hasCargoLock :: PackageSet (Prod r) -> FilePath -> PackageSet (Prod (PackageCargoFilePath ': r)) Source #
Run FetchRustGitDependencies
given the path to Cargo.lock
The lock file will be extracted as well.
tweakVersion :: PackageSet (Prod r) -> (NvcheckerOptions -> NvcheckerOptions) -> PackageSet (Prod (NvcheckerOptions ': r)) Source #
Set NvcheckerOptions
for a package, which can tweak the version number we obtain
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
.
Lenses
(%~) :: ASetter s t a b -> (a -> b) -> s -> t infixr 4 #
(%~
) applies a function to the target; an alternative explanation is that it is an inverse of sets
, which turns a setter into an ordinary function.
is the same thing as mapped
%~
reverse
.fmap
reverse
See over
if you want a non-operator synonym.
Negating the 1st element of a pair:
>>>
(1,2) & _1 %~ negate
(-1,2)
Turning all Left
s in a list to upper case:
>>>
(mapped._Left.mapped %~ toUpper) [Left "foo", Right "bar"]
[Left "FOO",Right "bar"]
(^.) :: s -> Getting a s a -> a infixl 8 #
(^.
) applies a getter to a value; in other words, it gets a value out of a structure using a getter (which can be a lens, traversal, fold, etc.).
Getting 1st field of a tuple:
(^.
_1
) :: (a, b) -> a (^.
_1
) =fst
When (^.
) is used with a traversal, it combines all results using the Monoid
instance for the resulting type. For instance, for lists it would be simple concatenation:
>>>
("str","ing") ^. each
"string"
The reason for this is that traversals use Applicative
, and the Applicative
instance for Const
uses monoid concatenation to combine “effects” of Const
.
A non-operator version of (^.
) is called view
, and it's a bit more general than (^.
) (it works in MonadReader
). If you need the general version, you can get it from microlens-mtl; otherwise there's view
available in Lens.Micro.Extras.
module NvFetcher.Types.Lens