{-# LANGUAGE MultiParamTypeClasses, FlexibleInstances, UndecidableInstances #-}
{-# LANGUAGE Safe, GADTs, DefaultSignatures, KindSignatures, DataKinds, CPP #-}
{-# LANGUAGE PatternSynonyms, ViewPatterns #-}
#if __GLASGOW_HASKELL__ < 840
{-# LANGUAGE TypeInType #-}
#endif
module Data.Property
(
IsProp (..), PropertyKind, FieldKind, Prop (..),
FieldGet (..), get, gets',
FieldSet (..), set, sets',
pattern (:=), pattern (::=), pattern (:=$), pattern (::=$),
pattern (:<=), pattern (:<=$), pattern (:=<), pattern (:=<$),
FieldModify (..),
pattern (:~), pattern (:~$), pattern (::~), pattern (::~$),
pattern (:<~), pattern (:<~$), pattern (:~<), pattern (:~<$),
IsSwitch (..), FieldSwitch (..), switch, incr, decr
)
where
import Data.Typeable
import Data.Kind
import Control.Monad
default ()
data Prop m field record
where
Prop :: (Monad m, IsProp prop) => prop m field record -> Prop m field record
deriving ( Typeable )
class IsProp (prop :: PropertyKind)
where
performProp :: (Monad m) => record -> prop m field record -> m ()
instance IsProp SetProp
where
performProp :: record -> SetProp m field record -> m ()
performProp record
record (SetRecordPropM [field m record a]
field record -> m a
kl) = [field m record a] -> record -> a -> m ()
forall (m :: * -> *) (field :: FieldKind) record a.
(Monad m, FieldSet field) =>
[field m record a] -> record -> a -> m ()
setRecords [field m record a]
field record
record (a -> m ()) -> m a -> m ()
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< record -> m a
kl record
record
performProp record
record (SetRecordProp [field m record a]
field record -> a
f) = [field m record a] -> record -> a -> m ()
forall (m :: * -> *) (field :: FieldKind) record a.
(Monad m, FieldSet field) =>
[field m record a] -> record -> a -> m ()
setRecords [field m record a]
field record
record (record -> a
f record
record)
performProp record
record (SetPropM [field m record a]
field m a
mval) = [field m record a] -> record -> a -> m ()
forall (m :: * -> *) (field :: FieldKind) record a.
(Monad m, FieldSet field) =>
[field m record a] -> record -> a -> m ()
setRecords [field m record a]
field record
record (a -> m ()) -> m a -> m ()
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< m a
mval
performProp record
record (SetProp [field m record a]
field a
val) = [field m record a] -> record -> a -> m ()
forall (m :: * -> *) (field :: FieldKind) record a.
(Monad m, FieldSet field) =>
[field m record a] -> record -> a -> m ()
setRecords [field m record a]
field record
record a
val
setRecords :: (Monad m, FieldSet field) => [field m record a] -> record -> a -> m ()
setRecords :: [field m record a] -> record -> a -> m ()
setRecords [field m record a]
fields record
record a
val = [field m record a] -> (field m record a -> m ()) -> m ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
t a -> (a -> m b) -> m ()
forM_ [field m record a]
fields ((field m record a -> m ()) -> m ())
-> (field m record a -> m ()) -> m ()
forall a b. (a -> b) -> a -> b
$ \ field m record a
field -> field m record a -> record -> a -> m ()
forall (field :: FieldKind) (m :: * -> *) record a.
(FieldSet field, Monad m) =>
field m record a -> record -> a -> m ()
setRecord field m record a
field record
record a
val
instance IsProp ModifyProp
where
performProp :: record -> ModifyProp m field record -> m ()
performProp record
record (Modify [field m record a]
field record -> a -> a
f) = () () -> m () -> m ()
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ [field m record a] -> record -> (a -> a) -> m ()
forall (m :: * -> *) (field :: FieldKind) record b.
(Monad m, FieldModify field) =>
[field m record b] -> record -> (b -> b) -> m ()
modifyRecords [field m record a]
field record
record (record -> a -> a
f record
record)
performProp record
record (ModifyM [field m record a]
field record -> a -> m a
f) = () () -> m () -> m ()
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ [field m record a] -> record -> (a -> m a) -> m ()
forall (m :: * -> *) (field :: FieldKind) record b.
(Monad m, FieldModify field, FieldGet field) =>
[field m record b] -> record -> (b -> m b) -> m ()
modifyRecordsM [field m record a]
field record
record (record -> a -> m a
f record
record)
performProp record
record (ModifyProp [field m record a]
field a -> a
f) = () () -> m () -> m ()
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ [field m record a] -> record -> (a -> a) -> m ()
forall (m :: * -> *) (field :: FieldKind) record b.
(Monad m, FieldModify field) =>
[field m record b] -> record -> (b -> b) -> m ()
modifyRecords [field m record a]
field record
record a -> a
f
performProp record
record (ModifyPropM [field m record a]
field a -> m a
f) = () () -> m () -> m ()
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ [field m record a] -> record -> (a -> m a) -> m ()
forall (m :: * -> *) (field :: FieldKind) record b.
(Monad m, FieldModify field, FieldGet field) =>
[field m record b] -> record -> (b -> m b) -> m ()
modifyRecordsM [field m record a]
field record
record a -> m a
f
modifyRecords :: (Monad m, FieldModify field) =>
[field m record b] -> record -> (b -> b) -> m ()
modifyRecords :: [field m record b] -> record -> (b -> b) -> m ()
modifyRecords [field m record b]
fields record
record b -> b
f = [field m record b]
fields [field m record b] -> (field m record b -> m b) -> m ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
t a -> (a -> m b) -> m ()
`forM_` \ field m record b
field -> field m record b -> record -> (b -> b) -> m b
forall (field :: FieldKind) (m :: * -> *) record a.
(FieldModify field, Monad m) =>
field m record a -> record -> (a -> a) -> m a
modifyRecord field m record b
field record
record b -> b
f
modifyRecordsM :: (Monad m, FieldModify field, FieldGet field) =>
[field m record b] -> record -> (b -> m b) -> m ()
modifyRecordsM :: [field m record b] -> record -> (b -> m b) -> m ()
modifyRecordsM [field m record b]
fields record
record b -> m b
f = [field m record b]
fields [field m record b] -> (field m record b -> m b) -> m ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
t a -> (a -> m b) -> m ()
`forM_` \ field m record b
field -> field m record b -> record -> (b -> m b) -> m b
forall (field :: FieldKind) (m :: * -> *) record a.
(FieldModify field, Monad m, FieldGet field) =>
field m record a -> record -> (a -> m a) -> m a
modifyRecordM field m record b
field record
record b -> m b
f
instance IsProp SwitchProp
where
performProp :: record -> SwitchProp m field record -> m ()
performProp record
record (SwitchProp Int
n field m record a
field) = field m record a -> record -> Int -> m ()
forall (field :: FieldKind) (m :: * -> *) a record.
(FieldSwitch field, Monad m, IsSwitch a) =>
field m record a -> record -> Int -> m ()
switchRecord field m record a
field record
record Int
n
type FieldKind = (Type -> Type) -> Type -> Type -> Type
type PropertyKind = (Type -> Type) -> FieldKind -> Type -> Type
class FieldGet field
where
getRecord :: (Monad m) => field m record a -> record -> m a
class FieldSet field
where
setRecord :: (Monad m) => field m record a -> record -> a -> m ()
class (FieldSet field) => FieldModify field
where
default modifyRecord :: (Monad m, FieldGet field) =>
field m record a -> record -> (a -> a) -> m a
modifyRecord :: (Monad m) => field m record a -> record -> (a -> a) -> m a
modifyRecord field m record a
field record
record a -> a
f = do
a
val <- a -> a
f (a -> a) -> m a -> m a
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> field m record a -> record -> m a
forall (m :: * -> *) (field :: FieldKind) record a.
(Monad m, FieldGet field) =>
field m record a -> record -> m a
get field m record a
field record
record
field m record a -> record -> a -> m ()
forall (field :: FieldKind) (m :: * -> *) record a.
(FieldSet field, Monad m) =>
field m record a -> record -> a -> m ()
setRecord field m record a
field record
record a
val
a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return a
val
modifyRecordM :: (Monad m, FieldGet field) =>
field m record a -> record -> (a -> m a) -> m a
modifyRecordM field m record a
field record
record a -> m a
f = do
a
val <- a -> m a
f (a -> m a) -> m a -> m a
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< field m record a -> record -> m a
forall (m :: * -> *) (field :: FieldKind) record a.
(Monad m, FieldGet field) =>
field m record a -> record -> m a
get field m record a
field record
record
field m record a -> record -> a -> m ()
forall (field :: FieldKind) (m :: * -> *) record a.
(FieldSet field, Monad m) =>
field m record a -> record -> a -> m ()
setRecord field m record a
field record
record a
val
a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return a
val
class FieldSwitch field
where
switchRecord :: (Monad m, IsSwitch a) => field m record a -> record -> Int -> m ()
data SetProp m field record
where
SetProp :: (FieldSet field) =>
[field m record a] -> a -> SetProp m field record
SetPropM :: (FieldSet field) =>
[field m record a] -> m a -> SetProp m field record
SetRecordProp :: (FieldSet field) =>
[field m record a] -> (record -> a) -> SetProp m field record
SetRecordPropM :: (FieldSet field) =>
[field m record a] -> (record -> m a) -> SetProp m field record
deriving ( Typeable )
data ModifyProp m field record
where
ModifyProp :: (FieldModify field) =>
[field m record a] -> (a -> a) -> ModifyProp m field record
ModifyPropM :: (FieldModify field, FieldGet field) =>
[field m record a] -> (a -> m a) -> ModifyProp m field record
Modify :: (FieldModify field) =>
[field m record a] -> (record -> a -> a) -> ModifyProp m field record
ModifyM :: (FieldModify field, FieldGet field) =>
[field m record a] -> (record -> a -> m a) -> ModifyProp m field record
deriving ( Typeable )
data SwitchProp m field record
where
SwitchProp :: (Monad m, FieldSwitch field, IsSwitch a) =>
Int -> field m record a -> SwitchProp m field record
deriving ( Typeable )
pattern (:=) ::
(
Typeable m, Typeable field, Typeable record,
Monad m, FieldSet field
) => field m record a -> a -> Prop m field record
pattern field $b:= :: field m record a -> a -> Prop m field record
$m:= :: forall r (m :: * -> *) (field :: FieldKind) record.
(Typeable m, Typeable field, Typeable record, Monad m,
FieldSet field) =>
Prop m field record
-> (forall a. field m record a -> a -> r) -> (Void# -> r) -> r
:= val = [field] :=$ val
pattern (::=) ::
(
Typeable m, Typeable field, Typeable record,
Monad m, FieldSet field
) => field m record a -> (record -> a) -> Prop m field record
pattern field $b::= :: field m record a -> (record -> a) -> Prop m field record
$m::= :: forall r (m :: * -> *) (field :: FieldKind) record.
(Typeable m, Typeable field, Typeable record, Monad m,
FieldSet field) =>
Prop m field record
-> (forall a. field m record a -> (record -> a) -> r)
-> (Void# -> r)
-> r
::= f = [field] ::=$ f
pattern (:=$) ::
(
Typeable m, Typeable field, Typeable record,
Monad m, FieldSet field
) => [field m record a] -> a -> Prop m field record
pattern field $b:=$ :: [field m record a] -> a -> Prop m field record
$m:=$ :: forall r (m :: * -> *) (field :: FieldKind) record.
(Typeable m, Typeable field, Typeable record, Monad m,
FieldSet field) =>
Prop m field record
-> (forall a. [field m record a] -> a -> r) -> (Void# -> r) -> r
:=$ val <- (cast -> Just (SetProp field val))
where
(:=$) = SetProp m field record -> Prop m field record
forall (m :: * -> *) (prop :: PropertyKind) (field :: FieldKind)
record.
(Monad m, IsProp prop) =>
prop m field record -> Prop m field record
Prop (SetProp m field record -> Prop m field record)
-> ([field m record a] -> a -> SetProp m field record)
-> [field m record a]
-> a
-> Prop m field record
forall c d a b. (c -> d) -> (a -> b -> c) -> a -> b -> d
... [field m record a] -> a -> SetProp m field record
forall (field :: FieldKind) (m :: * -> *) record a.
FieldSet field =>
[field m record a] -> a -> SetProp m field record
SetProp
pattern (::=$) ::
(
Typeable m, Typeable field, Typeable record, Monad m, FieldSet field
) => [field m record a] -> (record -> a) -> Prop m field record
pattern field $b::=$ :: [field m record a] -> (record -> a) -> Prop m field record
$m::=$ :: forall r (m :: * -> *) (field :: FieldKind) record.
(Typeable m, Typeable field, Typeable record, Monad m,
FieldSet field) =>
Prop m field record
-> (forall a. [field m record a] -> (record -> a) -> r)
-> (Void# -> r)
-> r
::=$ f <- (cast -> Just (SetRecordProp field f))
where
(::=$) = SetProp m field record -> Prop m field record
forall (m :: * -> *) (prop :: PropertyKind) (field :: FieldKind)
record.
(Monad m, IsProp prop) =>
prop m field record -> Prop m field record
Prop (SetProp m field record -> Prop m field record)
-> ([field m record a] -> (record -> a) -> SetProp m field record)
-> [field m record a]
-> (record -> a)
-> Prop m field record
forall c d a b. (c -> d) -> (a -> b -> c) -> a -> b -> d
... [field m record a] -> (record -> a) -> SetProp m field record
forall (field :: FieldKind) (m :: * -> *) record a.
FieldSet field =>
[field m record a] -> (record -> a) -> SetProp m field record
SetRecordProp
pattern (:~) ::
(
Typeable m, Typeable field, Typeable record,
Monad m, FieldModify field
) => field m record a -> (a -> a) -> Prop m field record
pattern field $b:~ :: field m record a -> (a -> a) -> Prop m field record
$m:~ :: forall r (m :: * -> *) (field :: FieldKind) record.
(Typeable m, Typeable field, Typeable record, Monad m,
FieldModify field) =>
Prop m field record
-> (forall a. field m record a -> (a -> a) -> r)
-> (Void# -> r)
-> r
:~ f = [field] :~$ f
pattern (::~) ::
(
Typeable m, Typeable field, Typeable record,
Monad m, FieldModify field
) => field m record a -> (record -> a -> a) -> Prop m field record
pattern field $b::~ :: field m record a -> (record -> a -> a) -> Prop m field record
$m::~ :: forall r (m :: * -> *) (field :: FieldKind) record.
(Typeable m, Typeable field, Typeable record, Monad m,
FieldModify field) =>
Prop m field record
-> (forall a. field m record a -> (record -> a -> a) -> r)
-> (Void# -> r)
-> r
::~ f = [field] ::~$ f
pattern (:~$) ::
(
Typeable m, Typeable field, Typeable record,
Monad m, FieldModify field
) => [field m record a] -> (a -> a) -> Prop m field record
pattern field $b:~$ :: [field m record a] -> (a -> a) -> Prop m field record
$m:~$ :: forall r (m :: * -> *) (field :: FieldKind) record.
(Typeable m, Typeable field, Typeable record, Monad m,
FieldModify field) =>
Prop m field record
-> (forall a. [field m record a] -> (a -> a) -> r)
-> (Void# -> r)
-> r
:~$ f <- (cast -> Just (ModifyProp field f))
where
(:~$) = ModifyProp m field record -> Prop m field record
forall (m :: * -> *) (prop :: PropertyKind) (field :: FieldKind)
record.
(Monad m, IsProp prop) =>
prop m field record -> Prop m field record
Prop (ModifyProp m field record -> Prop m field record)
-> ([field m record a] -> (a -> a) -> ModifyProp m field record)
-> [field m record a]
-> (a -> a)
-> Prop m field record
forall c d a b. (c -> d) -> (a -> b -> c) -> a -> b -> d
... [field m record a] -> (a -> a) -> ModifyProp m field record
forall (field :: FieldKind) (m :: * -> *) record a.
FieldModify field =>
[field m record a] -> (a -> a) -> ModifyProp m field record
ModifyProp
pattern (::~$) ::
(
Typeable m, Typeable field, Typeable record,
Monad m, FieldModify field
) => [field m record a] -> (record -> a -> a) -> Prop m field record
pattern field $b::~$ :: [field m record a] -> (record -> a -> a) -> Prop m field record
$m::~$ :: forall r (m :: * -> *) (field :: FieldKind) record.
(Typeable m, Typeable field, Typeable record, Monad m,
FieldModify field) =>
Prop m field record
-> (forall a. [field m record a] -> (record -> a -> a) -> r)
-> (Void# -> r)
-> r
::~$ f <- (cast -> Just (Modify field f))
where
(::~$) = ModifyProp m field record -> Prop m field record
forall (m :: * -> *) (prop :: PropertyKind) (field :: FieldKind)
record.
(Monad m, IsProp prop) =>
prop m field record -> Prop m field record
Prop (ModifyProp m field record -> Prop m field record)
-> ([field m record a]
-> (record -> a -> a) -> ModifyProp m field record)
-> [field m record a]
-> (record -> a -> a)
-> Prop m field record
forall c d a b. (c -> d) -> (a -> b -> c) -> a -> b -> d
... [field m record a]
-> (record -> a -> a) -> ModifyProp m field record
forall (field :: FieldKind) (m :: * -> *) record a.
FieldModify field =>
[field m record a]
-> (record -> a -> a) -> ModifyProp m field record
Modify
pattern (:<=) ::
(
Typeable m, Typeable field, Typeable record,
Monad m, FieldSet field
) => field m record a -> m a -> Prop m field record
pattern field $b:<= :: field m record a -> m a -> Prop m field record
$m:<= :: forall r (m :: * -> *) (field :: FieldKind) record.
(Typeable m, Typeable field, Typeable record, Monad m,
FieldSet field) =>
Prop m field record
-> (forall a. field m record a -> m a -> r) -> (Void# -> r) -> r
:<= mval = [field] :<=$ mval
pattern (:=<) ::
(
Typeable m, Typeable field, Typeable record,
Monad m, FieldSet field
) => field m record a -> (record -> m a) -> Prop m field record
pattern field $b:=< :: field m record a -> (record -> m a) -> Prop m field record
$m:=< :: forall r (m :: * -> *) (field :: FieldKind) record.
(Typeable m, Typeable field, Typeable record, Monad m,
FieldSet field) =>
Prop m field record
-> (forall a. field m record a -> (record -> m a) -> r)
-> (Void# -> r)
-> r
:=< f = [field] :=<$ f
pattern (:<=$) ::
(
Typeable m, Typeable field, Typeable record,
Monad m, FieldSet field
) => [field m record a] -> m a -> Prop m field record
pattern field $b:<=$ :: [field m record a] -> m a -> Prop m field record
$m:<=$ :: forall r (m :: * -> *) (field :: FieldKind) record.
(Typeable m, Typeable field, Typeable record, Monad m,
FieldSet field) =>
Prop m field record
-> (forall a. [field m record a] -> m a -> r) -> (Void# -> r) -> r
:<=$ mval <- (cast -> Just (SetPropM field mval))
where
(:<=$) = SetProp m field record -> Prop m field record
forall (m :: * -> *) (prop :: PropertyKind) (field :: FieldKind)
record.
(Monad m, IsProp prop) =>
prop m field record -> Prop m field record
Prop (SetProp m field record -> Prop m field record)
-> ([field m record a] -> m a -> SetProp m field record)
-> [field m record a]
-> m a
-> Prop m field record
forall c d a b. (c -> d) -> (a -> b -> c) -> a -> b -> d
... [field m record a] -> m a -> SetProp m field record
forall (field :: FieldKind) (m :: * -> *) record a.
FieldSet field =>
[field m record a] -> m a -> SetProp m field record
SetPropM
pattern (:=<$) ::
(
Typeable m, Typeable field, Typeable record,
Monad m, FieldSet field
) => [field m record a] -> (record -> m a) -> Prop m field record
pattern field $b:=<$ :: [field m record a] -> (record -> m a) -> Prop m field record
$m:=<$ :: forall r (m :: * -> *) (field :: FieldKind) record.
(Typeable m, Typeable field, Typeable record, Monad m,
FieldSet field) =>
Prop m field record
-> (forall a. [field m record a] -> (record -> m a) -> r)
-> (Void# -> r)
-> r
:=<$ f <- (cast -> Just (SetRecordPropM field f))
where
(:=<$) = SetProp m field record -> Prop m field record
forall (m :: * -> *) (prop :: PropertyKind) (field :: FieldKind)
record.
(Monad m, IsProp prop) =>
prop m field record -> Prop m field record
Prop (SetProp m field record -> Prop m field record)
-> ([field m record a]
-> (record -> m a) -> SetProp m field record)
-> [field m record a]
-> (record -> m a)
-> Prop m field record
forall c d a b. (c -> d) -> (a -> b -> c) -> a -> b -> d
... [field m record a] -> (record -> m a) -> SetProp m field record
forall (field :: FieldKind) (m :: * -> *) record a.
FieldSet field =>
[field m record a] -> (record -> m a) -> SetProp m field record
SetRecordPropM
pattern (:<~) ::
(
Typeable m, Typeable field, Typeable record, Monad m,
FieldModify field, FieldGet field
) => field m record a -> (a -> m a) -> Prop m field record
pattern field $b:<~ :: field m record a -> (a -> m a) -> Prop m field record
$m:<~ :: forall r (m :: * -> *) (field :: FieldKind) record.
(Typeable m, Typeable field, Typeable record, Monad m,
FieldModify field, FieldGet field) =>
Prop m field record
-> (forall a. field m record a -> (a -> m a) -> r)
-> (Void# -> r)
-> r
:<~ f = [field] :<~$ f
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
pattern field $b:~< :: field m record a -> (record -> a -> m a) -> Prop m field record
$m:~< :: forall r (m :: * -> *) (field :: FieldKind) record.
(Typeable m, Typeable field, Typeable record, Monad m,
FieldModify field, FieldGet field) =>
Prop m field record
-> (forall a. field m record a -> (record -> a -> m a) -> r)
-> (Void# -> r)
-> r
:~< f = [field] :~<$ f
pattern (:<~$) ::
(
Typeable m, Typeable field, Typeable record,
Monad m, FieldModify field, FieldGet field
) => [field m record a] -> (a -> m a) -> Prop m field record
pattern field $b:<~$ :: [field m record a] -> (a -> m a) -> Prop m field record
$m:<~$ :: forall r (m :: * -> *) (field :: FieldKind) record.
(Typeable m, Typeable field, Typeable record, Monad m,
FieldModify field, FieldGet field) =>
Prop m field record
-> (forall a. [field m record a] -> (a -> m a) -> r)
-> (Void# -> r)
-> r
:<~$ f <- (cast -> Just (ModifyPropM field f))
where
(:<~$) = ModifyProp m field record -> Prop m field record
forall (m :: * -> *) (prop :: PropertyKind) (field :: FieldKind)
record.
(Monad m, IsProp prop) =>
prop m field record -> Prop m field record
Prop (ModifyProp m field record -> Prop m field record)
-> ([field m record a] -> (a -> m a) -> ModifyProp m field record)
-> [field m record a]
-> (a -> m a)
-> Prop m field record
forall c d a b. (c -> d) -> (a -> b -> c) -> a -> b -> d
... [field m record a] -> (a -> m a) -> ModifyProp m field record
forall (field :: FieldKind) (m :: * -> *) record a.
(FieldModify field, FieldGet field) =>
[field m record a] -> (a -> m a) -> ModifyProp m field record
ModifyPropM
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
pattern field $b:~<$ :: [field m record a] -> (record -> a -> m a) -> Prop m field record
$m:~<$ :: forall r (m :: * -> *) (field :: FieldKind) record.
(Typeable m, Typeable field, Typeable record, Monad m,
FieldModify field, FieldGet field) =>
Prop m field record
-> (forall a. [field m record a] -> (record -> a -> m a) -> r)
-> (Void# -> r)
-> r
:~<$ f <- (cast -> Just (ModifyM field f))
where
(:~<$) = ModifyProp m field record -> Prop m field record
forall (m :: * -> *) (prop :: PropertyKind) (field :: FieldKind)
record.
(Monad m, IsProp prop) =>
prop m field record -> Prop m field record
Prop (ModifyProp m field record -> Prop m field record)
-> ([field m record a]
-> (record -> a -> m a) -> ModifyProp m field record)
-> [field m record a]
-> (record -> a -> m a)
-> Prop m field record
forall c d a b. (c -> d) -> (a -> b -> c) -> a -> b -> d
... [field m record a]
-> (record -> a -> m a) -> ModifyProp m field record
forall (field :: FieldKind) (m :: * -> *) record a.
(FieldModify field, FieldGet field) =>
[field m record a]
-> (record -> a -> m a) -> ModifyProp m field record
ModifyM
class IsSwitch switch
where
toggle :: Int -> switch -> switch
instance IsSwitch Bool
where
toggle :: Int -> Bool -> Bool
toggle Int
n Bool
False = Int -> Bool
forall a. Integral a => a -> Bool
even Int
n
toggle Int
n Bool
True = Int -> Bool
forall a. Integral a => a -> Bool
odd Int
n
instance (Integral i) => IsSwitch i where toggle :: Int -> i -> i
toggle Int
n i
i = Int -> i
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
n i -> i -> i
forall a. Num a => a -> a -> a
+ i
i
get :: (Monad m, FieldGet field) => field m record a -> record -> m a
get :: field m record a -> record -> m a
get = field m record a -> record -> m a
forall (field :: FieldKind) (m :: * -> *) record a.
(FieldGet field, Monad m) =>
field m record a -> record -> m a
getRecord
gets' :: (Monad m, FieldGet field) => record -> [field m record a] -> m [a]
gets' :: record -> [field m record a] -> m [a]
gets' = (field m record a -> m a) -> [field m record a] -> m [a]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM ((field m record a -> m a) -> [field m record a] -> m [a])
-> (record -> field m record a -> m a)
-> record
-> [field m record a]
-> m [a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (field m record a -> record -> m a)
-> record -> field m record a -> m a
forall a b c. (a -> b -> c) -> b -> a -> c
flip field m record a -> record -> m a
forall (field :: FieldKind) (m :: * -> *) record a.
(FieldGet field, Monad m) =>
field m record a -> record -> m a
getRecord
set :: (Monad m) => record -> [Prop m field record] -> m ()
set :: record -> [Prop m field record] -> m ()
set record
record = (Prop m field record -> m ()) -> [Prop m field record] -> m ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ ((Prop m field record -> m ()) -> [Prop m field record] -> m ())
-> (Prop m field record -> m ()) -> [Prop m field record] -> m ()
forall a b. (a -> b) -> a -> b
$ \ (Prop prop m field record
prop) -> record -> prop m field record -> m ()
forall (prop :: PropertyKind) (m :: * -> *) record
(field :: FieldKind).
(IsProp prop, Monad m) =>
record -> prop m field record -> m ()
performProp record
record prop m field record
prop
sets' :: (Monad m) => record -> [Prop m field record] -> m ()
sets' :: record -> [Prop m field record] -> m ()
sets' = record -> [Prop m field record] -> m ()
forall (m :: * -> *) record (field :: FieldKind).
Monad m =>
record -> [Prop m field record] -> m ()
set
switch :: (Monad m, FieldSwitch field, IsSwitch a) =>
field m record a -> Int -> Prop m field record
switch :: field m record a -> Int -> Prop m field record
switch field m record a
field Int
n = SwitchProp m field record -> Prop m field record
forall (m :: * -> *) (prop :: PropertyKind) (field :: FieldKind)
record.
(Monad m, IsProp prop) =>
prop m field record -> Prop m field record
Prop (Int -> field m record a -> SwitchProp m field record
forall (m :: * -> *) (field :: FieldKind) a record.
(Monad m, FieldSwitch field, IsSwitch a) =>
Int -> field m record a -> SwitchProp m field record
SwitchProp Int
n field m record a
field)
incr :: (Monad m, FieldSwitch field, IsSwitch a) =>
field m record a -> Prop m field record
incr :: field m record a -> Prop m field record
incr = SwitchProp m field record -> Prop m field record
forall (m :: * -> *) (prop :: PropertyKind) (field :: FieldKind)
record.
(Monad m, IsProp prop) =>
prop m field record -> Prop m field record
Prop (SwitchProp m field record -> Prop m field record)
-> (field m record a -> SwitchProp m field record)
-> field m record a
-> Prop m field record
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> field m record a -> SwitchProp m field record
forall (m :: * -> *) (field :: FieldKind) a record.
(Monad m, FieldSwitch field, IsSwitch a) =>
Int -> field m record a -> SwitchProp m field record
SwitchProp Int
1
decr :: (Monad m, FieldSwitch field, IsSwitch a) =>
field m record a -> Prop m field record
decr :: field m record a -> Prop m field record
decr = SwitchProp m field record -> Prop m field record
forall (m :: * -> *) (prop :: PropertyKind) (field :: FieldKind)
record.
(Monad m, IsProp prop) =>
prop m field record -> Prop m field record
Prop (SwitchProp m field record -> Prop m field record)
-> (field m record a -> SwitchProp m field record)
-> field m record a
-> Prop m field record
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> field m record a -> SwitchProp m field record
forall (m :: * -> *) (field :: FieldKind) a record.
(Monad m, FieldSwitch field, IsSwitch a) =>
Int -> field m record a -> SwitchProp m field record
SwitchProp (-Int
1)
(...) :: (c -> d) -> (a -> b -> c) -> a -> b -> d
... :: (c -> d) -> (a -> b -> c) -> a -> b -> d
(...) = ((b -> c) -> b -> d) -> (a -> b -> c) -> a -> b -> d
forall b c a. (b -> c) -> (a -> b) -> a -> c
(.) (((b -> c) -> b -> d) -> (a -> b -> c) -> a -> b -> d)
-> ((c -> d) -> (b -> c) -> b -> d)
-> (c -> d)
-> (a -> b -> c)
-> a
-> b
-> d
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (c -> d) -> (b -> c) -> b -> d
forall b c a. (b -> c) -> (a -> b) -> a -> c
(.)