context-0.1.1.1: Thread-indexed, nested contexts

Safe HaskellNone
LanguageHaskell2010

Context

Contents

Synopsis

Introduction

This module provides an opaque Store for thread-indexed storage around arbitrary context values. The interface supports nesting context values per thread, and at any point, the calling thread may ask for its current context.

Note that threads in Haskell have no explicit parent-child relationship. So if you register a context in a Store produced by withEmptyStore, spin up a separate thread, and from that thread you ask for a context, that thread will not have a context in the Store. Use Context.Concurrent as a drop-in replacement for Control.Concurrent to have the library handle context propagation from one thread to another automatically. Otherwise, you must explicitly register contexts from each thread when using a Store produced by withEmptyStore.

If you have a default context that is always applicable to all threads, you may wish to use withNonEmptyStore. All threads may access this default context (without leveraging Context.Concurrent or explicitly registering context for the threads) when using a Store produced by withNonEmptyStore.

Regardless of how you initialize your Store, every thread is free to nest its own specific context values.

This module is designed to be imported qualified:

import qualified Context

Storage

data Store ctx Source #

Opaque type that manages thread-indexed storage of context values.

Since: 0.1.0.0

withNonEmptyStore :: ctx -> (Store ctx -> IO a) -> IO a Source #

Provides a new, non-empty Store that uses the specified context value as a default when the calling thread has no registered context. mine, mines, and adjust are guaranteed to never throw NotFoundException when applied to a non-empty Store.

Since: 0.1.0.0

withEmptyStore :: (Store ctx -> IO a) -> IO a Source #

Provides a new, empty Store. mine, mines, and adjust will throw NotFoundException when the calling thread has no registered context. Useful when the Store will contain context values that are always thread-specific.

Since: 0.1.0.0

Operations

Registering context

use :: Store ctx -> ctx -> IO a -> IO a Source #

Register a context in the specified Store on behalf of the calling thread, for the duration of the specified action.

Since: 0.1.0.0

adjust :: Store ctx -> (ctx -> ctx) -> IO a -> IO a Source #

Adjust the calling thread's context in the specified Store for the duration of the specified action. Throws a NotFoundException when the calling thread has no registered context.

Since: 0.1.0.0

Asking for context

mine :: Store ctx -> IO ctx Source #

Provide the calling thread its current context from the specified Store. Throws a NotFoundException when the calling thread has no registered context.

Since: 0.1.0.0

mines :: Store ctx -> (ctx -> a) -> IO a Source #

Provide the calling thread a selection from its current context in the specified Store. Throws a NotFoundException when the calling thread has no registered context.

Since: 0.1.0.0

mineMay :: Store ctx -> IO (Maybe ctx) Source #

Provide the calling thread its current context from the specified Store, if present.

Since: 0.1.0.0

minesMay :: Store ctx -> (ctx -> a) -> IO (Maybe a) Source #

Provide the calling thread a selection from its current context in the specified Store, if present.

Since: 0.1.0.0

Views

Exceptions

data NotFoundException Source #

An exception which may be thrown when the calling thread does not have a registered context.

Since: 0.1.0.0

Constructors

NotFoundException 

Fields

Concurrency

Lower-level storage