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

Data.MField

Description

Data.MField provides mutable field type for record-style operations.

Synopsis

Exports

module Data.Field

Mutable field

data MField m record a where Source #

MField represents field with mutable value and accessors. Unlike fields of type Field, MField fields are undesirable (and sometimes impossible) to be stored in the global environment. The dynamic nature of MField means changing accessors for specific records, so accessors do not contain a record argument.

MField isn't designed for accessing external abstract objects and interfaces, it doesn't give the same freedom as Field, but at the same time it allows you to create flexible connections between fields and values without having to reconcile them.

MField contains a function that takes a record and returns an MFieldRef.

Example:

   newtype HasField a = HasField {someField :: MFieldRep IO a}
   
   field :: MField IO (HasField a) a
   field =  MField (ref.someField)
   
   main :: IO ()
   main =  do
     putStrLn "Put some number"
     record <- fmap HasField $ link =<< var =<< readLn :: IO (HasField Integer)
     print =<< get field record
     
     set record [getter field :~ fmap (* 2)]
     print =<< get field record
 

Since: 0.2

Constructors

MField :: MonadVar m => (record -> MFieldRef m a) -> MField m record a 

Instances

Instances details
FieldSwitch MField Source # 
Instance details

Defined in Data.MField

Methods

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

FieldModify MField Source # 
Instance details

Defined in Data.MField

Methods

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

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

FieldSet MField Source # 
Instance details

Defined in Data.MField

Methods

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

FieldGet MField Source # 
Instance details

Defined in Data.MField

Methods

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

class IsRef ref where Source #

Methods

link :: MonadVar m => Var m a -> m (ref m a) Source #

Create new reference to the given variable.

ref :: MonadVar m => ref m a -> MFieldRef m a Source #

Get an associated MFieldRef reference to the given reference.

Instances

Instances details
IsRef MFieldRep Source # 
Instance details

Defined in Data.MField

Methods

link :: MonadVar m => Var m a -> m (MFieldRep m a) Source #

ref :: forall (m :: Type -> Type) a. MonadVar m => MFieldRep m a -> MFieldRef m a Source #

IsRef MFieldRef Source # 
Instance details

Defined in Data.MField

Methods

link :: MonadVar m => Var m a -> m (MFieldRef m a) Source #

ref :: forall (m :: Type -> Type) a. MonadVar m => MFieldRef m a -> MFieldRef m a Source #

data MFieldRef m a Source #

MFieldRef is a structure containing accessors for a specific field of a specific record. As a rule, it makes sense to store MFieldRef in the record to which it refers.

Instances

Instances details
IsRef MFieldRef Source # 
Instance details

Defined in Data.MField

Methods

link :: MonadVar m => Var m a -> m (MFieldRef m a) Source #

ref :: forall (m :: Type -> Type) a. MonadVar m => MFieldRef m a -> MFieldRef m a Source #

data MFieldRep m a Source #

MFieldRep is a helper type that stores a variable and its accessors.

Instances

Instances details
IsRef MFieldRep Source # 
Instance details

Defined in Data.MField

Methods

link :: MonadVar m => Var m a -> m (MFieldRep m a) Source #

ref :: forall (m :: Type -> Type) a. MonadVar m => MFieldRep m a -> MFieldRef m a Source #

getter :: MField m record a -> Field m record (m a) Source #

setter :: MField m record a -> Field m record (a -> m ()) Source #

modifier :: MField m record a -> Field m record ((a -> a) -> m a) Source #

modifierM :: MField m record a -> Field m record ((a -> m a) -> m a) Source #