Safe Haskell | None |
---|---|
Language | Haskell2010 |
Synopsis
-
class
(
Monad
m,
Alternative
(
STM
m),
MonadPlus
(
STM
m)) =>
MonadSTM
m
where
- type STM m = (stm :: Type -> Type ) | stm -> m
- type TVar m :: Type -> Type
- type TMVar m :: Type -> Type
- type TQueue m :: Type -> Type
- type TBQueue m :: Type -> Type
- atomically :: HasCallStack => STM m a -> m a
- newTVar :: a -> STM m ( TVar m a)
- readTVar :: TVar m a -> STM m a
- writeTVar :: TVar m a -> a -> STM m ()
- retry :: STM m a
- orElse :: STM m a -> STM m a -> STM m a
- modifyTVar :: TVar m a -> (a -> a) -> STM m ()
- modifyTVar' :: TVar m a -> (a -> a) -> STM m ()
- stateTVar :: TVar m s -> (s -> (a, s)) -> STM m a
- swapTVar :: TVar m a -> a -> STM m a
- check :: Bool -> STM m ()
- newTMVar :: a -> STM m ( TMVar m a)
- newEmptyTMVar :: STM m ( TMVar m a)
- takeTMVar :: TMVar m a -> STM m a
- tryTakeTMVar :: TMVar m a -> STM m ( Maybe a)
- putTMVar :: TMVar m a -> a -> STM m ()
- tryPutTMVar :: TMVar m a -> a -> STM m Bool
- readTMVar :: TMVar m a -> STM m a
- tryReadTMVar :: TMVar m a -> STM m ( Maybe a)
- swapTMVar :: TMVar m a -> a -> STM m a
- isEmptyTMVar :: TMVar m a -> STM m Bool
- newTQueue :: STM m ( TQueue m a)
- readTQueue :: TQueue m a -> STM m a
- tryReadTQueue :: TQueue m a -> STM m ( Maybe a)
- peekTQueue :: TQueue m a -> STM m a
- tryPeekTQueue :: TQueue m a -> STM m ( Maybe a)
- writeTQueue :: TQueue m a -> a -> STM m ()
- isEmptyTQueue :: TQueue m a -> STM m Bool
- newTBQueue :: Natural -> STM m ( TBQueue m a)
- readTBQueue :: TBQueue m a -> STM m a
- tryReadTBQueue :: TBQueue m a -> STM m ( Maybe a)
- peekTBQueue :: TBQueue m a -> STM m a
- tryPeekTBQueue :: TBQueue m a -> STM m ( Maybe a)
- flushTBQueue :: TBQueue m a -> STM m [a]
- writeTBQueue :: TBQueue m a -> a -> STM m ()
- lengthTBQueue :: TBQueue m a -> STM m Natural
- isEmptyTBQueue :: TBQueue m a -> STM m Bool
- isFullTBQueue :: TBQueue m a -> STM m Bool
- newTVarIO :: a -> m ( TVar m a)
- readTVarIO :: TVar m a -> m a
- newTMVarIO :: a -> m ( TMVar m a)
- newEmptyTMVarIO :: m ( TMVar m a)
- newTQueueIO :: m ( TQueue m a)
- newTBQueueIO :: Natural -> m ( TBQueue m a)
-
class
MonadSTM
m =>
MonadLabelledSTM
m
where
- labelTVar :: TVar m a -> String -> STM m ()
- labelTMVar :: TMVar m a -> String -> STM m ()
- labelTQueue :: TQueue m a -> String -> STM m ()
- labelTBQueue :: TBQueue m a -> String -> STM m ()
- labelTVarIO :: TVar m a -> String -> m ()
- labelTMVarIO :: TMVar m a -> String -> m ()
- labelTQueueIO :: TQueue m a -> String -> m ()
- labelTBQueueIO :: TBQueue m a -> String -> m ()
-
class
(
MonadSTM
m,
Monad
(
InspectMonad
m)) =>
MonadInspectSTM
m
where
- type InspectMonad m :: Type -> Type
- inspectTVar :: proxy m -> TVar m a -> InspectMonad m a
- inspectTMVar :: proxy m -> TMVar m a -> InspectMonad m ( Maybe a)
-
data
TraceValue
where
- TraceValue :: forall tr. Typeable tr => {..} -> TraceValue
- pattern TraceDynamic :: () => forall tr. Typeable tr => tr -> TraceValue
- pattern TraceString :: String -> TraceValue
- pattern DontTrace :: TraceValue
-
class
MonadInspectSTM
m =>
MonadTraceSTM
m
where
- traceTVar :: proxy m -> TVar m a -> ( Maybe a -> a -> InspectMonad m TraceValue ) -> STM m ()
- traceTMVar :: proxy m -> TMVar m a -> ( Maybe ( Maybe a) -> Maybe a -> InspectMonad m TraceValue ) -> STM m ()
- traceTQueue :: proxy m -> TQueue m a -> ( Maybe [a] -> [a] -> InspectMonad m TraceValue ) -> STM m ()
- traceTBQueue :: proxy m -> TBQueue m a -> ( Maybe [a] -> [a] -> InspectMonad m TraceValue ) -> STM m ()
- traceTVarIO :: proxy m -> TVar m a -> ( Maybe a -> a -> InspectMonad m TraceValue ) -> m ()
- traceTMVarIO :: proxy m -> TMVar m a -> ( Maybe ( Maybe a) -> Maybe a -> InspectMonad m TraceValue ) -> m ()
- traceTQueueIO :: proxy m -> TQueue m a -> ( Maybe [a] -> [a] -> InspectMonad m TraceValue ) -> m ()
- traceTBQueueIO :: proxy m -> TBQueue m a -> ( Maybe [a] -> [a] -> InspectMonad m TraceValue ) -> m ()
- type LazyTVar m = TVar m
- type LazyTMVar m = TMVar m
- newtype TMVarDefault m a = TMVar ( TVar m ( Maybe a))
- labelTMVarDefault :: MonadLabelledSTM m => TMVarDefault m a -> String -> STM m ()
- traceTMVarDefault :: MonadTraceSTM m => proxy m -> TMVarDefault m a -> ( Maybe ( Maybe a) -> Maybe a -> InspectMonad m TraceValue ) -> STM m ()
- newTMVarDefault :: MonadSTM m => a -> STM m ( TMVarDefault m a)
- newTMVarIODefault :: MonadSTM m => a -> m ( TMVarDefault m a)
- newEmptyTMVarDefault :: MonadSTM m => STM m ( TMVarDefault m a)
- newEmptyTMVarIODefault :: MonadSTM m => m ( TMVarDefault m a)
- takeTMVarDefault :: MonadSTM m => TMVarDefault m a -> STM m a
- tryTakeTMVarDefault :: MonadSTM m => TMVarDefault m a -> STM m ( Maybe a)
- putTMVarDefault :: MonadSTM m => TMVarDefault m a -> a -> STM m ()
- tryPutTMVarDefault :: MonadSTM m => TMVarDefault m a -> a -> STM m Bool
- readTMVarDefault :: MonadSTM m => TMVarDefault m a -> STM m a
- tryReadTMVarDefault :: MonadSTM m => TMVarDefault m a -> STM m ( Maybe a)
- swapTMVarDefault :: MonadSTM m => TMVarDefault m a -> a -> STM m a
- isEmptyTMVarDefault :: MonadSTM m => TMVarDefault m a -> STM m Bool
- data TQueueDefault m a = TQueue !( TVar m [a]) !( TVar m [a])
- labelTQueueDefault :: MonadLabelledSTM m => TQueueDefault m a -> String -> STM m ()
- newTQueueDefault :: MonadSTM m => STM m ( TQueueDefault m a)
- readTQueueDefault :: MonadSTM m => TQueueDefault m a -> STM m a
- tryReadTQueueDefault :: MonadSTM m => TQueueDefault m a -> STM m ( Maybe a)
- peekTQueueDefault :: MonadSTM m => TQueueDefault m a -> STM m a
- tryPeekTQueueDefault :: MonadSTM m => TQueueDefault m a -> STM m ( Maybe a)
- writeTQueueDefault :: MonadSTM m => TQueueDefault m a -> a -> STM m ()
- isEmptyTQueueDefault :: MonadSTM m => TQueueDefault m a -> STM m Bool
- data TBQueueDefault m a = TBQueue !( TVar m Natural ) !( TVar m [a]) !( TVar m Natural ) !( TVar m [a]) ! Natural
- labelTBQueueDefault :: MonadLabelledSTM m => TBQueueDefault m a -> String -> STM m ()
- newTBQueueDefault :: MonadSTM m => Natural -> STM m ( TBQueueDefault m a)
- readTBQueueDefault :: MonadSTM m => TBQueueDefault m a -> STM m a
- tryReadTBQueueDefault :: MonadSTM m => TBQueueDefault m a -> STM m ( Maybe a)
- peekTBQueueDefault :: MonadSTM m => TBQueueDefault m a -> STM m a
- tryPeekTBQueueDefault :: MonadSTM m => TBQueueDefault m a -> STM m ( Maybe a)
- writeTBQueueDefault :: MonadSTM m => TBQueueDefault m a -> a -> STM m ()
- isEmptyTBQueueDefault :: MonadSTM m => TBQueueDefault m a -> STM m Bool
- isFullTBQueueDefault :: MonadSTM m => TBQueueDefault m a -> STM m Bool
- lengthTBQueueDefault :: MonadSTM m => TBQueueDefault m a -> STM m Natural
- flushTBQueueDefault :: MonadSTM m => TBQueueDefault m a -> STM m [a]
- throwSTM :: ( MonadSTM m, MonadThrow ( STM m), Exception e) => e -> STM m a
- catchSTM :: ( MonadSTM m, MonadCatch ( STM m), Exception e) => STM m a -> (e -> STM m a) -> STM m a
- newTVarM :: MonadSTM m => a -> m ( TVar m a)
- newTMVarM :: MonadSTM m => a -> m ( TMVar m a)
- newTMVarMDefault :: MonadSTM m => a -> m ( TMVarDefault m a)
- newEmptyTMVarM :: MonadSTM m => m ( TMVar m a)
- newEmptyTMVarMDefault :: MonadSTM m => m ( TMVarDefault m a)
-
newtype
WrappedSTM
(t :: Trans) r (m ::
Type
->
Type
) a =
WrappedSTM
{
- runWrappedSTM :: STM m a
Documentation
class ( Monad m, Alternative ( STM m), MonadPlus ( STM m)) => MonadSTM m where Source #
atomically , newTVar , readTVar , writeTVar , retry , orElse , newTMVar , newEmptyTMVar , takeTMVar , tryTakeTMVar , putTMVar , tryPutTMVar , readTMVar , tryReadTMVar , swapTMVar , isEmptyTMVar , newTQueue , readTQueue , tryReadTQueue , peekTQueue , tryPeekTQueue , writeTQueue , isEmptyTQueue , newTBQueue , readTBQueue , tryReadTBQueue , peekTBQueue , tryPeekTBQueue , flushTBQueue , writeTBQueue , lengthTBQueue , isEmptyTBQueue , isFullTBQueue
type STM m = (stm :: Type -> Type ) | stm -> m Source #
type TVar m :: Type -> Type Source #
type TMVar m :: Type -> Type Source #
atomically :: HasCallStack => STM m a -> m a Source #
newTVar :: a -> STM m ( TVar m a) Source #
readTVar :: TVar m a -> STM m a Source #
writeTVar :: TVar m a -> a -> STM m () Source #
orElse :: STM m a -> STM m a -> STM m a Source #
modifyTVar :: TVar m a -> (a -> a) -> STM m () Source #
modifyTVar' :: TVar m a -> (a -> a) -> STM m () Source #
stateTVar :: TVar m s -> (s -> (a, s)) -> STM m a Source #
@since io-classes-0.2.0.0
swapTVar :: TVar m a -> a -> STM m a Source #
check :: Bool -> STM m () Source #
newTMVar :: a -> STM m ( TMVar m a) Source #
newEmptyTMVar :: STM m ( TMVar m a) Source #
takeTMVar :: TMVar m a -> STM m a Source #
tryTakeTMVar :: TMVar m a -> STM m ( Maybe a) Source #
putTMVar :: TMVar m a -> a -> STM m () Source #
tryPutTMVar :: TMVar m a -> a -> STM m Bool Source #
readTMVar :: TMVar m a -> STM m a Source #
tryReadTMVar :: TMVar m a -> STM m ( Maybe a) Source #
swapTMVar :: TMVar m a -> a -> STM m a Source #
isEmptyTMVar :: TMVar m a -> STM m Bool Source #
newTQueue :: STM m ( TQueue m a) Source #
readTQueue :: TQueue m a -> STM m a Source #
tryReadTQueue :: TQueue m a -> STM m ( Maybe a) Source #
peekTQueue :: TQueue m a -> STM m a Source #
tryPeekTQueue :: TQueue m a -> STM m ( Maybe a) Source #
writeTQueue :: TQueue m a -> a -> STM m () Source #
isEmptyTQueue :: TQueue m a -> STM m Bool Source #
newTBQueue :: Natural -> STM m ( TBQueue m a) Source #
readTBQueue :: TBQueue m a -> STM m a Source #
tryReadTBQueue :: TBQueue m a -> STM m ( Maybe a) Source #
peekTBQueue :: TBQueue m a -> STM m a Source #
tryPeekTBQueue :: TBQueue m a -> STM m ( Maybe a) Source #
flushTBQueue :: TBQueue m a -> STM m [a] Source #
writeTBQueue :: TBQueue m a -> a -> STM m () Source #
lengthTBQueue :: TBQueue m a -> STM m Natural Source #
Since: 0.2.0.0
isEmptyTBQueue :: TBQueue m a -> STM m Bool Source #
isFullTBQueue :: TBQueue m a -> STM m Bool Source #
newTVarIO :: a -> m ( TVar m a) Source #
readTVarIO :: TVar m a -> m a Source #
newTMVarIO :: a -> m ( TMVar m a) Source #
newEmptyTMVarIO :: m ( TMVar m a) Source #
newTQueueIO :: m ( TQueue m a) Source #
newTBQueueIO :: Natural -> m ( TBQueue m a) Source #
Instances
class MonadSTM m => MonadLabelledSTM m where Source #
labelTVar :: TVar m a -> String -> STM m () Source #
labelTMVar :: TMVar m a -> String -> STM m () Source #
labelTQueue :: TQueue m a -> String -> STM m () Source #
labelTBQueue :: TBQueue m a -> String -> STM m () Source #
labelTVarIO :: TVar m a -> String -> m () Source #
default labelTVarIO :: TVar m a -> String -> m () Source #
labelTMVarIO :: TMVar m a -> String -> m () Source #
default labelTMVarIO :: TMVar m a -> String -> m () Source #
labelTQueueIO :: TQueue m a -> String -> m () Source #
default labelTQueueIO :: TQueue m a -> String -> m () Source #
labelTBQueueIO :: TBQueue m a -> String -> m () Source #
default labelTBQueueIO :: TBQueue m a -> String -> m () Source #
Instances
MonadLabelledSTM IO Source # |
noop instance |
Defined in Control.Monad.Class.MonadSTM labelTVar :: TVar IO a -> String -> STM IO () Source # labelTMVar :: TMVar IO a -> String -> STM IO () Source # labelTQueue :: TQueue IO a -> String -> STM IO () Source # labelTBQueue :: TBQueue IO a -> String -> STM IO () Source # labelTVarIO :: TVar IO a -> String -> IO () Source # labelTMVarIO :: TMVar IO a -> String -> IO () Source # |
class ( MonadSTM m, Monad ( InspectMonad m)) => MonadInspectSTM m where Source #
This type class is indented for 'io-sim', where one might want to access
TVar
in the underlying
ST
monad.
type InspectMonad m :: Type -> Type Source #
inspectTVar :: proxy m -> TVar m a -> InspectMonad m a Source #
inspectTMVar :: proxy m -> TMVar m a -> InspectMonad m ( Maybe a) Source #
Instances
MonadInspectSTM IO Source # | |
Defined in Control.Monad.Class.MonadSTM inspectTVar :: proxy IO -> TVar IO a -> InspectMonad IO a Source # inspectTMVar :: proxy IO -> TMVar IO a -> InspectMonad IO ( Maybe a) Source # |
data TraceValue where Source #
A GADT which instructs how to trace the value. The
traceDynamic
will
use dynamic tracing, e.g.
traceM
; while
traceString
will be traced with
EventSay
.
TraceValue | |
|
pattern TraceDynamic :: () => forall tr. Typeable tr => tr -> TraceValue |
Use only dynamic tracer. |
pattern TraceString :: String -> TraceValue |
Use only string tracing. |
pattern DontTrace :: TraceValue |
Do not trace the value. |
class MonadInspectSTM m => MonadTraceSTM m where Source #
MonadTraceSTM
allows to trace values of stm variables when stm
transaction is committed. This allows to verify invariants when a variable
is committed.
:: proxy m | |
-> TVar m a | |
-> ( Maybe a -> a -> InspectMonad m TraceValue ) |
callback which receives initial value or
|
-> STM m () |
traceTMVar :: proxy m -> TMVar m a -> ( Maybe ( Maybe a) -> Maybe a -> InspectMonad m TraceValue ) -> STM m () Source #
default traceTMVar :: TMVar m a ~ TMVarDefault m a => proxy m -> TMVar m a -> ( Maybe ( Maybe a) -> Maybe a -> InspectMonad m TraceValue ) -> STM m () Source #
traceTQueue :: proxy m -> TQueue m a -> ( Maybe [a] -> [a] -> InspectMonad m TraceValue ) -> STM m () Source #
traceTBQueue :: proxy m -> TBQueue m a -> ( Maybe [a] -> [a] -> InspectMonad m TraceValue ) -> STM m () Source #
traceTVarIO :: proxy m -> TVar m a -> ( Maybe a -> a -> InspectMonad m TraceValue ) -> m () Source #
default traceTVarIO :: proxy m -> TVar m a -> ( Maybe a -> a -> InspectMonad m TraceValue ) -> m () Source #
traceTMVarIO :: proxy m -> TMVar m a -> ( Maybe ( Maybe a) -> Maybe a -> InspectMonad m TraceValue ) -> m () Source #
default traceTMVarIO :: proxy m -> TMVar m a -> ( Maybe ( Maybe a) -> Maybe a -> InspectMonad m TraceValue ) -> m () Source #
traceTQueueIO :: proxy m -> TQueue m a -> ( Maybe [a] -> [a] -> InspectMonad m TraceValue ) -> m () Source #
default traceTQueueIO :: proxy m -> TQueue m a -> ( Maybe [a] -> [a] -> InspectMonad m TraceValue ) -> m () Source #
traceTBQueueIO :: proxy m -> TBQueue m a -> ( Maybe [a] -> [a] -> InspectMonad m TraceValue ) -> m () Source #
default traceTBQueueIO :: proxy m -> TBQueue m a -> ( Maybe [a] -> [a] -> InspectMonad m TraceValue ) -> m () Source #
Instances
MonadTraceSTM IO Source # |
noop instance |
Defined in Control.Monad.Class.MonadSTM traceTVar :: proxy IO -> TVar IO a -> ( Maybe a -> a -> InspectMonad IO TraceValue ) -> STM IO () Source # traceTMVar :: proxy IO -> TMVar IO a -> ( Maybe ( Maybe a) -> Maybe a -> InspectMonad IO TraceValue ) -> STM IO () Source # traceTQueue :: proxy IO -> TQueue IO a -> ( Maybe [a] -> [a] -> InspectMonad IO TraceValue ) -> STM IO () Source # traceTBQueue :: proxy IO -> TBQueue IO a -> ( Maybe [a] -> [a] -> InspectMonad IO TraceValue ) -> STM IO () Source # traceTVarIO :: proxy IO -> TVar IO a -> ( Maybe a -> a -> InspectMonad IO TraceValue ) -> IO () Source # traceTMVarIO :: proxy IO -> TMVar IO a -> ( Maybe ( Maybe a) -> Maybe a -> InspectMonad IO TraceValue ) -> IO () Source # traceTQueueIO :: proxy IO -> TQueue IO a -> ( Maybe [a] -> [a] -> InspectMonad IO TraceValue ) -> IO () Source # traceTBQueueIO :: proxy IO -> TBQueue IO a -> ( Maybe [a] -> [a] -> InspectMonad IO TraceValue ) -> IO () Source # |
Default
TMVar
implementation
labelTMVarDefault :: MonadLabelledSTM m => TMVarDefault m a -> String -> STM m () Source #
traceTMVarDefault :: MonadTraceSTM m => proxy m -> TMVarDefault m a -> ( Maybe ( Maybe a) -> Maybe a -> InspectMonad m TraceValue ) -> STM m () Source #
newTMVarDefault :: MonadSTM m => a -> STM m ( TMVarDefault m a) Source #
newTMVarIODefault :: MonadSTM m => a -> m ( TMVarDefault m a) Source #
newEmptyTMVarDefault :: MonadSTM m => STM m ( TMVarDefault m a) Source #
newEmptyTMVarIODefault :: MonadSTM m => m ( TMVarDefault m a) Source #
takeTMVarDefault :: MonadSTM m => TMVarDefault m a -> STM m a Source #
tryTakeTMVarDefault :: MonadSTM m => TMVarDefault m a -> STM m ( Maybe a) Source #
putTMVarDefault :: MonadSTM m => TMVarDefault m a -> a -> STM m () Source #
tryPutTMVarDefault :: MonadSTM m => TMVarDefault m a -> a -> STM m Bool Source #
readTMVarDefault :: MonadSTM m => TMVarDefault m a -> STM m a Source #
tryReadTMVarDefault :: MonadSTM m => TMVarDefault m a -> STM m ( Maybe a) Source #
swapTMVarDefault :: MonadSTM m => TMVarDefault m a -> a -> STM m a Source #
isEmptyTMVarDefault :: MonadSTM m => TMVarDefault m a -> STM m Bool Source #
Default
TBQueue
implementation
labelTQueueDefault :: MonadLabelledSTM m => TQueueDefault m a -> String -> STM m () Source #
newTQueueDefault :: MonadSTM m => STM m ( TQueueDefault m a) Source #
readTQueueDefault :: MonadSTM m => TQueueDefault m a -> STM m a Source #
tryReadTQueueDefault :: MonadSTM m => TQueueDefault m a -> STM m ( Maybe a) Source #
peekTQueueDefault :: MonadSTM m => TQueueDefault m a -> STM m a Source #
tryPeekTQueueDefault :: MonadSTM m => TQueueDefault m a -> STM m ( Maybe a) Source #
writeTQueueDefault :: MonadSTM m => TQueueDefault m a -> a -> STM m () Source #
isEmptyTQueueDefault :: MonadSTM m => TQueueDefault m a -> STM m Bool Source #
Default
TBQueue
implementation
data TBQueueDefault m a Source #
labelTBQueueDefault :: MonadLabelledSTM m => TBQueueDefault m a -> String -> STM m () Source #
newTBQueueDefault :: MonadSTM m => Natural -> STM m ( TBQueueDefault m a) Source #
readTBQueueDefault :: MonadSTM m => TBQueueDefault m a -> STM m a Source #
tryReadTBQueueDefault :: MonadSTM m => TBQueueDefault m a -> STM m ( Maybe a) Source #
peekTBQueueDefault :: MonadSTM m => TBQueueDefault m a -> STM m a Source #
tryPeekTBQueueDefault :: MonadSTM m => TBQueueDefault m a -> STM m ( Maybe a) Source #
writeTBQueueDefault :: MonadSTM m => TBQueueDefault m a -> a -> STM m () Source #
isEmptyTBQueueDefault :: MonadSTM m => TBQueueDefault m a -> STM m Bool Source #
isFullTBQueueDefault :: MonadSTM m => TBQueueDefault m a -> STM m Bool Source #
lengthTBQueueDefault :: MonadSTM m => TBQueueDefault m a -> STM m Natural Source #
flushTBQueueDefault :: MonadSTM m => TBQueueDefault m a -> STM m [a] Source #
MonadThrow aliases
throwSTM :: ( MonadSTM m, MonadThrow ( STM m), Exception e) => e -> STM m a Source #
throwIO
specialised to
stm
monad.
catchSTM :: ( MonadSTM m, MonadCatch ( STM m), Exception e) => STM m a -> (e -> STM m a) -> STM m a Source #
catch
specialized for an
stm
monad.
Deprecated API
newTMVarMDefault :: MonadSTM m => a -> m ( TMVarDefault m a) Source #
Deprecated: Use newTMVarIODefault
newEmptyTMVarM :: MonadSTM m => m ( TMVar m a) Source #
Deprecated: Use newEmptyTMVarIO
newEmptyTMVarMDefault :: MonadSTM m => m ( TMVarDefault m a) Source #
Deprecated: Use newEmptyTMVarIODefault
newtype WrappedSTM (t :: Trans) r (m :: Type -> Type ) a Source #
A newtype wrapper for an
STM
monad for monad transformers.
WrappedSTM | |
|