ngx-export-tools-1.2.4: Extra tools for Nginx Haskell module
Copyright(c) Alexey Radkov 2023-2024
LicenseBSD-style
Maintaineralexey.radkov@gmail.com
Stabilitystable
Portabilityportable
Safe HaskellSafe-Inferred
LanguageHaskell2010

NgxExport.Tools.Combinators

Description

 
Synopsis

Combinators of effectful actions

A set of functions to combine effectful actions for building handlers and services tuned for special purposes.

Exported functions

voidHandler Source #

Arguments

:: IO a

Target computation

-> IO ByteString 

Runs an effectful computation and then returns an empty ByteString.

This function saves printing the final return L.empty action in handlers that return unused or empty ByteString.

For example, service signalUpconf being used as an update callback in

type Upconf = [Text]

signalUpconf :: Upconf -> NgxExportService
signalUpconf upconf = const $ do
    mapConcurrently_ getUrl upconf
    return L.empty

ngxExportSimpleServiceTyped 'signalUpconf ''Upconf $
    PersistentService Nothing

returns an empty bytestring which is not used in a meaningful way, therefore it can be rewritten as

signalUpconf :: Upconf -> NgxExportService
signalUpconf = const . voidHandler . mapConcurrently_ getUrl

which helps to focus better on the computation itself.

Since: 1.2.0

voidHandler' Source #

Arguments

:: IO a

Target computation

-> b

Ignored value

-> IO ByteString 

Runs an effectful computation and then returns an empty ByteString.

The same as voidHandler except it accepts an additional value which is ignored. Implemented as

voidHandler' = const . voidHandler

This can be useful in declarations of services that accept a boolean flag which marks whether the service is running for the first time. This flag is often ignored though, in which case using voidHandler' can simplify code.

For instance, service signalUpconf from the example for voidHandler can be further simplified as

signalUpconf :: Upconf -> NgxExportService
signalUpconf = voidHandler' . mapConcurrently_ getUrl

Since: 1.2.1

voidService Source #

Arguments

:: a

Ignored configuration

-> Bool

Ignored boolean value

-> IO ByteString 

A void service which does nothing and returns an empty ByteString.

This can be useful for loading global data from the Nginx configuration in a more concise and declarative way.

For example, if data Conf in

newtype Conf = Conf Int deriving (Read, Show)

testLoadConf :: Conf -> NgxExportService
testLoadConf = voidService

ngxExportSimpleServiceTyped 'testLoadConf ''Conf SingleShotService

gets loaded by service testLoadConf from the Nginx configuration, then it can be accessed in the Haskell code via IORef data storage storage_Conf_testLoadConf.

Note that voidService is still an asynchronous service which means that the global data it loads may appear uninitialized in very early client requests. To ensure that the data gets loaded before processing client requests, consider using the synchronous initialization hook ngxExportInitHook as a distinct solution or in conjunction with other services.

Since: 1.2.3

Split services