fmr-0.2: Fields for Monadic Records library
Copyright(c) Andrey Mulik 2020-2021
LicenseBSD-style
Maintainerwork.a.mulik@gmail.com
Safe HaskellTrustworthy
LanguageHaskell2010

Data.Field

Description

Data.Field provides immutable field type for record-style operations.

Synopsis

Field

data Field m record a Source #

Normal field, which contain getter, setter and modifier.

Since fmr-0.2, you can also combine fmr fields using (.) and id from the Category class:

   outer :: (Monad m) => Field m outer inner
   inner :: (Monad m) => Field m inner value
   
   field :: (Monad m) => Field m outer value
   field =  outer.inner
 

Constructors

Field 

Fields

Instances

Instances details
FieldSwitch Field Source # 
Instance details

Defined in Data.Field

Methods

switchRecord :: (Monad m, IsSwitch a) => Field m record a -> record -> Int -> m () Source #

FieldModify Field Source # 
Instance details

Defined in Data.Field

Methods

modifyRecord :: Monad m => Field m record a -> record -> (a -> a) -> m a Source #

modifyRecordM :: (Monad m, FieldGet Field) => Field m record a -> record -> (a -> m a) -> m a Source #

FieldSet Field Source # 
Instance details

Defined in Data.Field

Methods

setRecord :: Monad m => Field m record a -> record -> a -> m () Source #

FieldGet Field Source # 
Instance details

Defined in Data.Field

Methods

getRecord :: Monad m => Field m record a -> record -> m a Source #

Monad m => Category (Field m :: Type -> Type -> Type) Source # 
Instance details

Defined in Data.Field

Methods

id :: forall (a :: k). Field m a a #

(.) :: forall (b :: k) (c :: k) (a :: k). Field m b c -> Field m a b -> Field m a c #

sfield :: Monad m => GetterFor m record a -> SetterFor m record a -> Field m record a Source #

sfield creates new field from given getter and setter.

type GetterFor m record a = record -> m a Source #

Getter type.

type SetterFor m record a = record -> a -> m () Source #

Setter type.

type ModifierFor m record a = record -> (a -> a) -> m a Source #

Modifier type.

type ModifierMFor m record a = record -> (a -> m a) -> m a Source #

Monadic modifier type.

IsMVar and MonadVar

class (Monad m, MonadVar m) => IsMVar m var where Source #

The IsMVar class provides this field for entire record access.

Please note that you cannot create IsMVar and MonadVar instances for some monad separately.

Methods

this :: Field m (var a) a Source #

this is common variable access field.

var :: a -> m (var a) Source #

Create and initialize new mutable variable.

Instances

Instances details
IsMVar IO IORef Source # 
Instance details

Defined in Data.Field

Methods

this :: Field IO (IORef a) a Source #

var :: a -> IO (IORef a) Source #

IsMVar IO MVar Source # 
Instance details

Defined in Data.Field

Methods

this :: Field IO (MVar a) a Source #

var :: a -> IO (MVar a) Source #

IsMVar STM TVar Source # 
Instance details

Defined in Data.Field

Methods

this :: Field STM (TVar a) a Source #

var :: a -> STM (TVar a) Source #

IsMVar (ST s) (STRef s) Source # 
Instance details

Defined in Data.Field

Methods

this :: Field (ST s) (STRef s a) a Source #

var :: a -> ST s (STRef s a) Source #

class (Monad m, IsMVar m (Var m)) => MonadVar m Source #

MonadVar is a class of monads for which defined at least one type of mutable variable.

Note that a variable of type (Var m) should be as simple possible for a given monad. I only has to implement the basic operations triad: read, write and update (which don't have to be atomic).

Associated Types

type Var m :: Type -> Type Source #

(Var m) is type of mutable variable in monad m.

Instances

Instances details
MonadVar IO Source # 
Instance details

Defined in Data.Field

Associated Types

type Var IO :: Type -> Type Source #

MonadVar STM Source # 
Instance details

Defined in Data.Field

Associated Types

type Var STM :: Type -> Type Source #

MonadVar (ST s) Source # 
Instance details

Defined in Data.Field

Associated Types

type Var (ST s) :: Type -> Type Source #