Subject: [bug#75528] [PATCH v3] services: Add power.

From: Tomas Volf <[email-masked]>
Date: Sun, 02 Mar 2025 00:46:14 +0100

Maxim Cournoyer <[email-masked]> writes:

> Hi Tomas,
>
> I was about to merge this, but I have one last (I promise!) question, see
> below.

No problem, I appreciate the review, it lead to higher code quality of
this series.

>
> Tomas Volf <[email-masked]> writes:
>
> [...]
>
>> +(define apcupsd-service-type
>> +  (service-type
>> +   (name 'apcupsd)
>> +   (description "Configure and optionally start the apcupsd.")
>> +   (extensions (list (service-extension activation-service-type
>> +                                        apcupsd-activation)
>> +                     (service-extension shepherd-root-service-type
>> +                                        apcupsd-shepherd-services)
>> +                     (service-extension pam-root-service-type
>> +                                        apcupsd-pam-extensions)))
>> +   (compose identity)
>> +   (extend (lambda (cfg lst)
>> +             (fold (cut <> <>) cfg lst)))
>
> What does the above extend does?  I find the (cut <> <>) particularly
> cryptic, as it's typically used to specialize procedures, which there
> are none above.

I consider the behavior of the default #f value for extend field to be
unfortunate, so I prefer to specify extend for all my services.  Yet in
this case there is no obvious thing to extend, so I opted for the
extension to be a procedure, taking in the configuration and returning,
possibly modified, configuration.

The (cut <> <>) is just a handy, more concise way to write
(lambda (proc arg) (proc arg)).

What are your thoughts here?  Should I just drop both compose and extend
from here?  Or is it fine like this?

Tomas

-- 
There are only two hard things in Computer Science:
cache invalidation, naming things and off-by-one errors.