services: Add 'simple-service'.

* gnu/services.scm (simple-service): New procedure.
* doc/guix.texi (Service Reference): Document it.
This commit is contained in:
Ludovic Courtès 2016-09-19 13:31:06 +09:00
parent bf307a7a54
commit 71654dfdda
No known key found for this signature in database
GPG Key ID: 090B11993D9AEBB5
2 changed files with 27 additions and 0 deletions

View File

@ -11348,6 +11348,25 @@ the extension; it must return a valid value for the target service.
Return true if @var{obj} is a service extension.
@end deffn
Occasionally, you might want to simply extend an existing service. This
involves creating a new service type and specifying the extension of
interest, which can be verbose; the @code{simple-service} procedure
provides a shorthand for this.
@deffn {Scheme Procedure} simple-service @var{name} @var{target} @var{value}
Return a service that extends @var{target} with @var{value}. This works
by creating a singleton service type @var{name}, of which the returned
service is an instance.
For example, this extends mcron (@pxref{Scheduled Job Execution}) with
an additional job:
@example
(simple-service 'my-mcron-job mcron-service-type
#~(job '(next-hour (3)) "guix gc -F 2G"))
@end example
@end deffn
At the core of the service abstraction lies the @code{fold-services}
procedure, which is responsible for ``compiling'' a list of services
down to a single directory that contains everything needed to boot and

View File

@ -50,6 +50,7 @@
service-kind
service-parameters
simple-service
modify-services
service-back-edges
fold-services
@ -141,6 +142,13 @@
(type service-kind)
(parameters service-parameters))
(define (simple-service name target value)
"Return a service that extends TARGET with VALUE. This works by creating a
singleton service type NAME, of which the returned service is an instance."
(let* ((extension (service-extension target identity))
(type (service-type (name name)
(extensions (list extension)))))
(service type value)))
(define-syntax %modify-service
(syntax-rules (=>)