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

Data.Property

Description

Data.Property new-style properties.

Synopsis

Generalized properties

class IsProp (prop :: PropertyKind) where Source #

IsProp is a property class that allows you to extend fmr syntax. Now you can create new property types and use it with existing in set list of actions.

Since: 0.2

Methods

performProp :: Monad m => record -> prop m field record -> m () Source #

performProp record prop performs an action on record using prop.

type PropertyKind = (Type -> Type) -> FieldKind -> Type -> Type Source #

@since 0.2 Service kind synonym.

type FieldKind = (Type -> Type) -> Type -> Type -> Type Source #

@since 0.2 Service kind synonym.

data Prop m field record where Source #

Prop is new, generalized and extensible property type (existential), which may contain any IsProp value.

Since: 0.2

Constructors

Prop :: (Monad m, IsProp prop) => prop m field record -> Prop m field record 

Basic properties

class FieldGet field where Source #

@since 0.2 Property getter class.

Methods

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

getRecord field record return record's value using field.

Instances

Instances details
FieldGet Field Source # 
Instance details

Defined in Data.Field

Methods

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

FieldGet MField Source # 
Instance details

Defined in Data.MField

Methods

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

FieldGet field => FieldGet (Observe field) Source # 
Instance details

Defined in Data.Field.Observe

Methods

getRecord :: Monad m => Observe field m record a -> record -> m a Source #

get :: (Monad m, FieldGet field) => field m record a -> record -> m a Source #

The get function reads current value of a field.

gets' :: (Monad m, FieldGet field) => record -> [field m record a] -> m [a] Source #

gets' fields record returns list of record fields values.

class FieldSet field where Source #

@since 0.2 Property setter class.

Methods

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

setRecord field record value sets new record value.

Instances

Instances details
FieldSet Field Source # 
Instance details

Defined in Data.Field

Methods

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

FieldSet MField Source # 
Instance details

Defined in Data.MField

Methods

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

FieldSet field => FieldSet (Observe field) Source # 
Instance details

Defined in Data.Field.Observe

Methods

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

set :: Monad m => record -> [Prop m field record] -> m () Source #

set is the main function in fmr, which allows you to describe changing the value of a record as a sequence of operations on its fields, e.g.

sets' :: Monad m => record -> [Prop m field record] -> m () Source #

Just synonym for set.

Set properties

pattern (:=) :: (Typeable m, Typeable field, Typeable record, Monad m, FieldSet field) => field m record a -> a -> Prop m field record Source #

Pure value setter. set record [field := value] set value to record's field.

pattern (::=) :: (Typeable m, Typeable field, Typeable record, Monad m, FieldSet field) => field m record a -> (record -> a) -> Prop m field record Source #

Pure value setter with record. set record [field ::= f] set f record to record's field.

   set record [field ::= const val] === set record [field := val]
 

pattern (:=$) :: (Typeable m, Typeable field, Typeable record, Monad m, FieldSet field) => [field m record a] -> a -> Prop m field record Source #

Pure group setter. set record [fields :=$ value] set value to record's some fields.

   set record [[field] :=$ value] === set record [field := value]
 

Since: 0.2

pattern (::=$) :: (Typeable m, Typeable field, Typeable record, Monad m, FieldSet field) => [field m record a] -> (record -> a) -> Prop m field record Source #

Pure group setter with record. set record [fields ::=$ f] set f record to record's some fields.

   set record [[field] ::=$ f] === set record [field ::= f]
   set record [fields ::=$ const val] === set record [fields :=$ val]
 

Since: 0.2

Monadic set properties

pattern (:<=) :: (Typeable m, Typeable field, Typeable record, Monad m, FieldSet field) => field m record a -> m a -> Prop m field record Source #

Monadic value setter. set record [field :<= mvalue] set result of mvalue to record's field. Note that the mvalue is evaluated every time a field value is assigned.

   set record [field :<= return val] === set record [field := val]
   set record [field :<= mval] === do val <- mval; set record [field :<= val]
 

Since: 0.2

pattern (:<=$) :: (Typeable m, Typeable field, Typeable record, Monad m, FieldSet field) => [field m record a] -> m a -> Prop m field record Source #

Monadic group setter. set record [fields :<=$ mvalue] set result of mvalue to record's fields. Note that mvalue is evaluated only once, on the first assignment. Thus, the values of all the listed fields will be identical.

   set record [[field] :<=$ const f] === set record [field :<= val]
   set record [fields :<=$ mval] === do val <- mval; set record [fields :<=$ val]
 

Since: 0.2

pattern (:=<) :: (Typeable m, Typeable field, Typeable record, Monad m, FieldSet field) => field m record a -> (record -> m a) -> Prop m field record Source #

Monadic value setter with record. set record [field :=< mvalue] set result of mvalue record to record's field. Note that the mvalue is evaluated every time a field value is assigned.

   set record [field :=< const val] === set record [field :<= val]
   set record [field :=< f] === do val <- f record; set record [field := val]
 

Since: 0.2

pattern (:=<$) :: (Typeable m, Typeable field, Typeable record, Monad m, FieldSet field) => [field m record a] -> (record -> m a) -> Prop m field record Source #

Monadic group setter with record. set record [fields :=<$ f] set result of f record to record's fields. Note that f record is evaluated only once, on the first assignment. Thus, the values of all the listed fields will be identical.

   set record [[field] :=<$ f] === set record [field :=< val]
   set record [fields :=<$ const val] = set record [fields :=$ val]
   set record [fields :=<$ f] === do val <- f record; set record [fields :=$ val]
 

Since: 0.2

Modify properties

class FieldSet field => FieldModify field where Source #

Property modifier class.

Note that FieldModifier doesn't go well with write-only fields, because modifyRecord returns new value, and modifyRecordM also assumes the possibility of old value "leaking" (hence the FieldGet constraint is imposed on it).

Since: 0.2

Minimal complete definition

Nothing

Methods

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

modifyRecord field record upd modifies record field using upd. Returns new value.

default modifyRecord :: (Monad m, FieldGet field) => 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 #

modifyRecordM field record upd modifies record field using upd. Note that assumes the possibility of old value "leaking", e.g.:

       -- get value using modifyRecordM
       getLeak = do
         -- Some read-only fields
         x <- newWriteOnly
         y <- var Nothing
         -- write current value to y and do not modify.
         modifyRecordM this x ( val -> do set [this := Just val]; return val)
         -- leaking: return current value of "write-only" record
         get this y
     

So you cannot use it for write-only fields.

Instances

Instances details
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 #

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 #

(FieldModify field, FieldGet field) => FieldModify (Observe field) Source # 
Instance details

Defined in Data.Field.Observe

Methods

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

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

Modify properties

pattern (:~) :: (Typeable m, Typeable field, Typeable record, Monad m, FieldModify field) => field m record a -> (a -> a) -> Prop m field record Source #

Pure value modifier. set record [field :~ f] modify value of record's field using f function.

   set record [field :~ const val] === set record [field := val]
 

pattern (:~$) :: (Typeable m, Typeable field, Typeable record, Monad m, FieldModify field) => [field m record a] -> (a -> a) -> Prop m field record Source #

Pure group modifier. set record [fields :~$ f] modify values of record's fields using f function.

   set record [[field] :~$ val] === set record [field :~ val]
   set record [fields :~$ const val] === set record [field :=$ val]
 

Since: 0.2

pattern (::~) :: (Typeable m, Typeable field, Typeable record, Monad m, FieldModify field) => field m record a -> (record -> a -> a) -> Prop m field record Source #

Pure value modifier with record. set record [field ::~ f] modify value of record's field using f record function.

   set record [field ::~ const f] === set record [field :~ f]
 

pattern (::~$) :: (Typeable m, Typeable field, Typeable record, Monad m, FieldModify field) => [field m record a] -> (record -> a -> a) -> Prop m field record Source #

Pure group modifier with record. set record [fields ::~$ f] modify values of record's fields using f record function.

   set record [[field] ::~$ f] === set record [field ::~ f]
   set record [fields ::~$ const f] === set record [field :~$ f]
 

Since: 0.2

Monadic modify properties

pattern (:<~) :: (Typeable m, Typeable field, Typeable record, Monad m, FieldModify field, FieldGet field) => field m record a -> (a -> m a) -> Prop m field record Source #

Monadic value modifier. set record [field :<~ f] modifies value of record's field using f procedure. Note that the mvalue is called every time a field value is assigned.

   set record [field :<~ return val] === set record [fields := val]
 

Since: 0.2

pattern (:<~$) :: (Typeable m, Typeable field, Typeable record, Monad m, FieldModify field, FieldGet field) => [field m record a] -> (a -> m a) -> Prop m field record Source #

Monadic group modifier. set record [fields :<~$ f] modifies values of record's fields using f procedure.

   set record [[field] :<~$ f] === set record [field :<~ f]
   set record [fields :<~$ const mval] === set record [field :<=$ mval]
 

Since: 0.2

pattern (:~<) :: (Typeable m, Typeable field, Typeable record, Monad m, FieldModify field, FieldGet field) => field m record a -> (record -> a -> m a) -> Prop m field record Source #

Monadic value modifier with record. set record [field :<~ f] modifies value of record's field using f record procedure. Note that the f record is called every time a field value is assigned.

   set record [field :~< const f] === set record [fields :<~ f]
 

Since: 0.2

pattern (:~<$) :: (Typeable m, Typeable field, Typeable record, Monad m, FieldModify field, FieldGet field) => [field m record a] -> (record -> a -> m a) -> Prop m field record Source #

Monadic group modifier with record. set record [fields :~<$ f] modifies values of record's fields using f record procedure. Note that the f record is called every time a field value is assigned.

   set record [field :~<$ const f] === set record [fields :<~$ f]
 

Since: 0.2

Switch properties

class IsSwitch switch where Source #

Service class for switchable types.

Methods

toggle :: Int -> switch -> switch Source #

toggle s n "toggles" the state represented by the value s by n positions, for example:

       toggle n False = even n
       toggle n  True = odd  n
       toggle n  1234 = 1239 + n
     

Instances

Instances details
IsSwitch Bool Source # 
Instance details

Defined in Data.Property

Methods

toggle :: Int -> Bool -> Bool Source #

Integral i => IsSwitch i Source # 
Instance details

Defined in Data.Property

Methods

toggle :: Int -> i -> i Source #

class FieldSwitch field where Source #

Switch property modifier.

Note that FieldSwitch is designed for deterministic switches with a pre-known set of states and order of transitions between them, without branches. If you need more complex behavior, use FieldModify.

Methods

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

Repeated increment or decrement.

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 #

FieldSwitch MField Source # 
Instance details

Defined in Data.MField

Methods

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

FieldSwitch field => FieldSwitch (Observe field) Source # 
Instance details

Defined in Data.Field.Observe

Methods

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

switch :: (Monad m, FieldSwitch field, IsSwitch a) => field m record a -> Int -> Prop m field record Source #

switch changes the value by n steps.

incr :: (Monad m, FieldSwitch field, IsSwitch a) => field m record a -> Prop m field record Source #

incr field is same as switch field 1.

decr :: (Monad m, FieldSwitch field, IsSwitch a) => field m record a -> Prop m field record Source #

decr field is same as switch field (-1).