{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE BlockArguments #-}
module Control.Concurrent.STM.Incremental
( Mutability(Immutable, Mutable)
, Incremental
, incremental
, observe
, set
, setEq
, imap
, imapEq
, combine
, combineEq
, choose
, chooseEq
, immutable
, onUpdate
, history
) where
import Prelude
import Control.Concurrent.STM
import Control.Monad (when)
data Mutability = Immutable | Mutable
data Incremental (mutability :: Mutability) a = Incremental
{ forall (mutability :: Mutability) a.
Incremental mutability a -> TVar a
ref :: TVar a
, forall (mutability :: Mutability) a.
Incremental mutability a -> TVar (a -> STM ())
updateRef :: TVar (a -> STM ())
}
incremental
:: a
-> STM (Incremental 'Mutable a)
incremental :: forall a. a -> STM (Incremental 'Mutable a)
incremental a
a = do
TVar a
ref <- forall a. a -> STM (TVar a)
newTVar a
a
forall (mutability :: Mutability) a.
TVar a -> TVar (a -> STM ()) -> Incremental mutability a
Incremental TVar a
ref forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall a. a -> STM (TVar a)
newTVar (forall a b. a -> b -> a
const (forall (f :: * -> *) a. Applicative f => a -> f a
pure ()))
imap
:: (a -> b)
-> Incremental m a
-> STM (Incremental 'Immutable b)
imap :: forall a b (m :: Mutability).
(a -> b) -> Incremental m a -> STM (Incremental 'Immutable b)
imap a -> b
f (Incremental TVar a
ref TVar (a -> STM ())
updateRef) = do
TVar b
newRef <- forall a. TVar a -> STM a
readTVar TVar a
ref forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= forall a. a -> STM (TVar a)
newTVar forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> b
f
TVar (b -> STM ())
newUpdateRef <- forall a. a -> STM (TVar a)
newTVar (forall a b. a -> b -> a
const (forall (f :: * -> *) a. Applicative f => a -> f a
pure ()))
a -> STM ()
update <- forall a. TVar a -> STM a
readTVar TVar (a -> STM ())
updateRef
forall a. TVar a -> a -> STM ()
writeTVar TVar (a -> STM ())
updateRef \a
a -> do
a -> STM ()
update a
a
let b :: b
b = a -> b
f a
a
forall a. TVar a -> a -> STM ()
writeTVar TVar b
newRef b
b
b -> STM ()
newUpdate <- forall a. TVar a -> STM a
readTVar TVar (b -> STM ())
newUpdateRef
b -> STM ()
newUpdate b
b
forall (f :: * -> *) a. Applicative f => a -> f a
pure (forall (mutability :: Mutability) a.
TVar a -> TVar (a -> STM ()) -> Incremental mutability a
Incremental TVar b
newRef TVar (b -> STM ())
newUpdateRef)
imapEq
:: Eq b
=> (a -> b)
-> Incremental m a
-> STM (Incremental 'Immutable b)
imapEq :: forall b a (m :: Mutability).
Eq b =>
(a -> b) -> Incremental m a -> STM (Incremental 'Immutable b)
imapEq a -> b
f (Incremental TVar a
ref TVar (a -> STM ())
updateRef) = do
TVar b
newRef <- forall a. TVar a -> STM a
readTVar TVar a
ref forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= forall a. a -> STM (TVar a)
newTVar forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> b
f
TVar (b -> STM ())
newUpdateRef <- forall a. a -> STM (TVar a)
newTVar (forall a b. a -> b -> a
const (forall (f :: * -> *) a. Applicative f => a -> f a
pure ()))
a -> STM ()
update <- forall a. TVar a -> STM a
readTVar TVar (a -> STM ())
updateRef
forall a. TVar a -> a -> STM ()
writeTVar TVar (a -> STM ())
updateRef \a
a -> do
a -> STM ()
update a
a
b
b <- forall a. TVar a -> STM a
readTVar TVar b
newRef
let b' :: b
b' = a -> b
f a
a
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (b
b forall a. Eq a => a -> a -> Bool
/= b
b') do
forall a. TVar a -> a -> STM ()
writeTVar TVar b
newRef b
b'
b -> STM ()
newUpdate <- forall a. TVar a -> STM a
readTVar TVar (b -> STM ())
newUpdateRef
b -> STM ()
newUpdate b
b'
forall (f :: * -> *) a. Applicative f => a -> f a
pure (forall (mutability :: Mutability) a.
TVar a -> TVar (a -> STM ()) -> Incremental mutability a
Incremental TVar b
newRef TVar (b -> STM ())
newUpdateRef)
set
:: Incremental 'Mutable a
-> a
-> STM ()
set :: forall a. Incremental 'Mutable a -> a -> STM ()
set Incremental 'Mutable a
incr a
a = do
forall a. TVar a -> a -> STM ()
writeTVar (forall (mutability :: Mutability) a.
Incremental mutability a -> TVar a
ref Incremental 'Mutable a
incr) a
a
a -> STM ()
update <- forall a. TVar a -> STM a
readTVar (forall (mutability :: Mutability) a.
Incremental mutability a -> TVar (a -> STM ())
updateRef Incremental 'Mutable a
incr)
a -> STM ()
update a
a
setEq
:: Eq a
=> Incremental 'Mutable a
-> a
-> STM ()
setEq :: forall a. Eq a => Incremental 'Mutable a -> a -> STM ()
setEq Incremental 'Mutable a
incr a
a = do
a
a' <- forall a. TVar a -> STM a
readTVar (forall (mutability :: Mutability) a.
Incremental mutability a -> TVar a
ref Incremental 'Mutable a
incr)
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (a
a' forall a. Eq a => a -> a -> Bool
/= a
a) do
forall a. TVar a -> a -> STM ()
writeTVar (forall (mutability :: Mutability) a.
Incremental mutability a -> TVar a
ref Incremental 'Mutable a
incr) a
a
a -> STM ()
update <- forall a. TVar a -> STM a
readTVar (forall (mutability :: Mutability) a.
Incremental mutability a -> TVar (a -> STM ())
updateRef Incremental 'Mutable a
incr)
a -> STM ()
update a
a
observe
:: Incremental m a
-> STM a
observe :: forall (m :: Mutability) a. Incremental m a -> STM a
observe = forall a. TVar a -> STM a
readTVar forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (mutability :: Mutability) a.
Incremental mutability a -> TVar a
ref
combine
:: (a -> b -> c)
-> Incremental m a
-> Incremental m' b
-> STM (Incremental 'Immutable c)
combine :: forall a b c (m :: Mutability) (m' :: Mutability).
(a -> b -> c)
-> Incremental m a
-> Incremental m' b
-> STM (Incremental 'Immutable c)
combine a -> b -> c
f (Incremental TVar a
ref TVar (a -> STM ())
updateRef) (Incremental TVar b
ref' TVar (b -> STM ())
updateRef') = do
a
a <- forall a. TVar a -> STM a
readTVar TVar a
ref
b
b <- forall a. TVar a -> STM a
readTVar TVar b
ref'
TVar c
newRef <- forall a. a -> STM (TVar a)
newTVar (a -> b -> c
f a
a b
b)
TVar (c -> STM ())
newUpdateRef <- forall a. a -> STM (TVar a)
newTVar (forall a b. a -> b -> a
const (forall (f :: * -> *) a. Applicative f => a -> f a
pure ()))
a -> STM ()
update <- forall a. TVar a -> STM a
readTVar TVar (a -> STM ())
updateRef
b -> STM ()
update' <- forall a. TVar a -> STM a
readTVar TVar (b -> STM ())
updateRef'
forall a. TVar a -> a -> STM ()
writeTVar TVar (a -> STM ())
updateRef \a
a -> do
a -> STM ()
update a
a
b
b <- forall a. TVar a -> STM a
readTVar TVar b
ref'
let c :: c
c = a -> b -> c
f a
a b
b
forall a. TVar a -> a -> STM ()
writeTVar TVar c
newRef c
c
c -> STM ()
newUpdate <- forall a. TVar a -> STM a
readTVar TVar (c -> STM ())
newUpdateRef
c -> STM ()
newUpdate c
c
forall a. TVar a -> a -> STM ()
writeTVar TVar (b -> STM ())
updateRef' \b
b -> do
b -> STM ()
update' b
b
a
a <- forall a. TVar a -> STM a
readTVar TVar a
ref
let c :: c
c = a -> b -> c
f a
a b
b
forall a. TVar a -> a -> STM ()
writeTVar TVar c
newRef c
c
c -> STM ()
newUpdate <- forall a. TVar a -> STM a
readTVar TVar (c -> STM ())
newUpdateRef
c -> STM ()
newUpdate c
c
forall (f :: * -> *) a. Applicative f => a -> f a
pure (forall (mutability :: Mutability) a.
TVar a -> TVar (a -> STM ()) -> Incremental mutability a
Incremental TVar c
newRef TVar (c -> STM ())
newUpdateRef)
combineEq
:: Eq c
=> (a -> b -> c)
-> Incremental m a
-> Incremental m' b
-> STM (Incremental 'Immutable c)
combineEq :: forall c a b (m :: Mutability) (m' :: Mutability).
Eq c =>
(a -> b -> c)
-> Incremental m a
-> Incremental m' b
-> STM (Incremental 'Immutable c)
combineEq a -> b -> c
f (Incremental TVar a
ref TVar (a -> STM ())
updateRef) (Incremental TVar b
ref' TVar (b -> STM ())
updateRef') = do
a
a <- forall a. TVar a -> STM a
readTVar TVar a
ref
b
b <- forall a. TVar a -> STM a
readTVar TVar b
ref'
TVar c
newRef <- forall a. a -> STM (TVar a)
newTVar (a -> b -> c
f a
a b
b)
TVar (c -> STM ())
newUpdateRef <- forall a. a -> STM (TVar a)
newTVar (forall a b. a -> b -> a
const (forall (f :: * -> *) a. Applicative f => a -> f a
pure ()))
a -> STM ()
update <- forall a. TVar a -> STM a
readTVar TVar (a -> STM ())
updateRef
b -> STM ()
update' <- forall a. TVar a -> STM a
readTVar TVar (b -> STM ())
updateRef'
forall a. TVar a -> a -> STM ()
writeTVar TVar (a -> STM ())
updateRef \a
a -> do
a -> STM ()
update a
a
b
b <- forall a. TVar a -> STM a
readTVar TVar b
ref'
c
c <- forall a. TVar a -> STM a
readTVar TVar c
newRef
let c' :: c
c' = a -> b -> c
f a
a b
b
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (c
c forall a. Eq a => a -> a -> Bool
/= c
c') do
forall a. TVar a -> a -> STM ()
writeTVar TVar c
newRef c
c'
c -> STM ()
newUpdate <- forall a. TVar a -> STM a
readTVar TVar (c -> STM ())
newUpdateRef
c -> STM ()
newUpdate c
c'
forall a. TVar a -> a -> STM ()
writeTVar TVar (b -> STM ())
updateRef' \b
b -> do
b -> STM ()
update' b
b
a
a <- forall a. TVar a -> STM a
readTVar TVar a
ref
c
c <- forall a. TVar a -> STM a
readTVar TVar c
newRef
let c' :: c
c' = a -> b -> c
f a
a b
b
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (c
c forall a. Eq a => a -> a -> Bool
/= c
c') do
forall a. TVar a -> a -> STM ()
writeTVar TVar c
newRef c
c'
c -> STM ()
newUpdate <- forall a. TVar a -> STM a
readTVar TVar (c -> STM ())
newUpdateRef
c -> STM ()
newUpdate c
c'
forall (f :: * -> *) a. Applicative f => a -> f a
pure (forall (mutability :: Mutability) a.
TVar a -> TVar (a -> STM ()) -> Incremental mutability a
Incremental TVar c
newRef TVar (c -> STM ())
newUpdateRef)
immutable
:: Incremental 'Mutable b
-> Incremental 'Immutable b
immutable :: forall b. Incremental 'Mutable b -> Incremental 'Immutable b
immutable Incremental{TVar b
TVar (b -> STM ())
updateRef :: TVar (b -> STM ())
ref :: TVar b
updateRef :: forall (mutability :: Mutability) a.
Incremental mutability a -> TVar (a -> STM ())
ref :: forall (mutability :: Mutability) a.
Incremental mutability a -> TVar a
..} = Incremental{TVar b
TVar (b -> STM ())
updateRef :: TVar (b -> STM ())
ref :: TVar b
updateRef :: TVar (b -> STM ())
ref :: TVar b
..}
choose
:: Incremental m' a
-> (a -> Incremental m b)
-> STM (Incremental 'Immutable b)
choose :: forall (m' :: Mutability) a (m :: Mutability) b.
Incremental m' a
-> (a -> Incremental m b) -> STM (Incremental 'Immutable b)
choose (Incremental TVar a
ref TVar (a -> STM ())
updateRef) a -> Incremental m b
f = do
a
a <- forall a. TVar a -> STM a
readTVar TVar a
ref
let Incremental TVar b
ref' TVar (b -> STM ())
updateRef' = a -> Incremental m b
f a
a
TVar b
newRef <- forall a. TVar a -> STM a
readTVar TVar b
ref' forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= forall a. a -> STM (TVar a)
newTVar
TVar (b -> STM ())
newUpdateRef <- forall a. a -> STM (TVar a)
newTVar (forall a b. a -> b -> a
const (forall (f :: * -> *) a. Applicative f => a -> f a
pure ()))
b -> STM ()
update' <- forall a. TVar a -> STM a
readTVar TVar (b -> STM ())
updateRef'
a -> STM ()
update <- forall a. TVar a -> STM a
readTVar TVar (a -> STM ())
updateRef
TVar (TVar b, [TVar b])
updateFromWhichRef <- forall a. a -> STM (TVar a)
newTVar (TVar b
ref', [TVar b
ref'])
forall a. TVar a -> a -> STM ()
writeTVar TVar (b -> STM ())
updateRef' \b
b -> do
b -> STM ()
update' b
b
(TVar b
tvar, [TVar b]
_tvars) <- forall a. TVar a -> STM a
readTVar TVar (TVar b, [TVar b])
updateFromWhichRef
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (TVar b
tvar forall a. Eq a => a -> a -> Bool
== TVar b
ref') do
forall a. TVar a -> a -> STM ()
writeTVar TVar b
newRef b
b
b -> STM ()
newUpdate <- forall a. TVar a -> STM a
readTVar TVar (b -> STM ())
newUpdateRef
b -> STM ()
newUpdate b
b
forall a. TVar a -> a -> STM ()
writeTVar TVar (a -> STM ())
updateRef \a
a -> do
a -> STM ()
update a
a
(TVar b
currentRef, [TVar b]
pastRefs) <- forall a. TVar a -> STM a
readTVar TVar (TVar b, [TVar b])
updateFromWhichRef
let Incremental TVar b
ref'' TVar (b -> STM ())
updateRef'' = a -> Incremental m b
f a
a
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (TVar b
ref'' forall a. Eq a => a -> a -> Bool
/= TVar b
currentRef) do
b
b <- forall a. TVar a -> STM a
readTVar TVar b
ref''
forall a. TVar a -> a -> STM ()
writeTVar TVar b
newRef b
b
b -> STM ()
newUpdate <- forall a. TVar a -> STM a
readTVar TVar (b -> STM ())
newUpdateRef
b -> STM ()
newUpdate b
b
if Bool -> Bool
not (TVar b
ref'' forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [TVar b]
pastRefs) then do
b -> STM ()
update'' <- forall a. TVar a -> STM a
readTVar TVar (b -> STM ())
updateRef''
forall a. TVar a -> a -> STM ()
writeTVar TVar (b -> STM ())
updateRef'' \b
b -> do
b -> STM ()
update'' b
b
(TVar b
tvar, [TVar b]
_tvars) <- forall a. TVar a -> STM a
readTVar TVar (TVar b, [TVar b])
updateFromWhichRef
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (TVar b
tvar forall a. Eq a => a -> a -> Bool
== TVar b
ref'') do
forall a. TVar a -> a -> STM ()
writeTVar TVar b
newRef b
b
b -> STM ()
newUpdate <- forall a. TVar a -> STM a
readTVar TVar (b -> STM ())
newUpdateRef
b -> STM ()
newUpdate b
b
forall a. TVar a -> a -> STM ()
writeTVar TVar (TVar b, [TVar b])
updateFromWhichRef (TVar b
ref'', TVar b
ref'' forall a. a -> [a] -> [a]
: [TVar b]
pastRefs)
else forall a. TVar a -> a -> STM ()
writeTVar TVar (TVar b, [TVar b])
updateFromWhichRef (TVar b
ref'', [TVar b]
pastRefs)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (forall (mutability :: Mutability) a.
TVar a -> TVar (a -> STM ()) -> Incremental mutability a
Incremental TVar b
newRef TVar (b -> STM ())
newUpdateRef)
chooseEq :: Eq b
=> Incremental m' a
-> (a -> Incremental m b)
-> STM (Incremental 'Immutable b)
chooseEq :: forall b (m' :: Mutability) a (m :: Mutability).
Eq b =>
Incremental m' a
-> (a -> Incremental m b) -> STM (Incremental 'Immutable b)
chooseEq (Incremental TVar a
ref TVar (a -> STM ())
updateRef) a -> Incremental m b
f = do
a
a <- forall a. TVar a -> STM a
readTVar TVar a
ref
let Incremental TVar b
ref' TVar (b -> STM ())
updateRef' = a -> Incremental m b
f a
a
TVar b
newRef <- forall a. TVar a -> STM a
readTVar TVar b
ref' forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= forall a. a -> STM (TVar a)
newTVar
TVar (b -> STM ())
newUpdateRef <- forall a. a -> STM (TVar a)
newTVar (forall a b. a -> b -> a
const (forall (f :: * -> *) a. Applicative f => a -> f a
pure ()))
b -> STM ()
update' <- forall a. TVar a -> STM a
readTVar TVar (b -> STM ())
updateRef'
a -> STM ()
update <- forall a. TVar a -> STM a
readTVar TVar (a -> STM ())
updateRef
TVar (TVar b, [TVar b])
updateFromWhichRef <- forall a. a -> STM (TVar a)
newTVar (TVar b
ref', [TVar b
ref'])
forall a. TVar a -> a -> STM ()
writeTVar TVar (b -> STM ())
updateRef' \b
b -> do
b -> STM ()
update' b
b
(TVar b
tvar, [TVar b]
_tvars) <- forall a. TVar a -> STM a
readTVar TVar (TVar b, [TVar b])
updateFromWhichRef
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (TVar b
tvar forall a. Eq a => a -> a -> Bool
== TVar b
ref') do
b
b' <- forall a. TVar a -> STM a
readTVar TVar b
newRef
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (b
b' forall a. Eq a => a -> a -> Bool
/= b
b) do
forall a. TVar a -> a -> STM ()
writeTVar TVar b
newRef b
b
b -> STM ()
newUpdate <- forall a. TVar a -> STM a
readTVar TVar (b -> STM ())
newUpdateRef
b -> STM ()
newUpdate b
b
forall a. TVar a -> a -> STM ()
writeTVar TVar (a -> STM ())
updateRef \a
a -> do
a -> STM ()
update a
a
(TVar b
currentRef, [TVar b]
pastRefs) <- forall a. TVar a -> STM a
readTVar TVar (TVar b, [TVar b])
updateFromWhichRef
let Incremental TVar b
ref'' TVar (b -> STM ())
updateRef'' = a -> Incremental m b
f a
a
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (TVar b
ref'' forall a. Eq a => a -> a -> Bool
/= TVar b
currentRef) do
b
b <- forall a. TVar a -> STM a
readTVar TVar b
ref''
forall a. TVar a -> a -> STM ()
writeTVar TVar b
newRef b
b
b -> STM ()
newUpdate <- forall a. TVar a -> STM a
readTVar TVar (b -> STM ())
newUpdateRef
b -> STM ()
newUpdate b
b
if Bool -> Bool
not (TVar b
ref'' forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [TVar b]
pastRefs) then do
b -> STM ()
update'' <- forall a. TVar a -> STM a
readTVar TVar (b -> STM ())
updateRef''
forall a. TVar a -> a -> STM ()
writeTVar TVar (b -> STM ())
updateRef'' \b
b -> do
b -> STM ()
update'' b
b
(TVar b
tvar, [TVar b]
_tvars) <- forall a. TVar a -> STM a
readTVar TVar (TVar b, [TVar b])
updateFromWhichRef
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (TVar b
tvar forall a. Eq a => a -> a -> Bool
== TVar b
ref'') do
b
b' <- forall a. TVar a -> STM a
readTVar TVar b
newRef
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (b
b' forall a. Eq a => a -> a -> Bool
/= b
b) do
forall a. TVar a -> a -> STM ()
writeTVar TVar b
newRef b
b
b -> STM ()
newUpdate <- forall a. TVar a -> STM a
readTVar TVar (b -> STM ())
newUpdateRef
b -> STM ()
newUpdate b
b
forall a. TVar a -> a -> STM ()
writeTVar TVar (TVar b, [TVar b])
updateFromWhichRef (TVar b
ref'', TVar b
ref'' forall a. a -> [a] -> [a]
: [TVar b]
pastRefs)
else forall a. TVar a -> a -> STM ()
writeTVar TVar (TVar b, [TVar b])
updateFromWhichRef (TVar b
ref'', [TVar b]
pastRefs)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (forall (mutability :: Mutability) a.
TVar a -> TVar (a -> STM ()) -> Incremental mutability a
Incremental TVar b
newRef TVar (b -> STM ())
newUpdateRef)
onUpdate
:: Incremental m b
-> (b -> STM ())
-> STM ()
onUpdate :: forall (m :: Mutability) b.
Incremental m b -> (b -> STM ()) -> STM ()
onUpdate (Incremental TVar b
_ref TVar (b -> STM ())
updateRef) b -> STM ()
monitoring = do
b -> STM ()
update <- forall a. TVar a -> STM a
readTVar TVar (b -> STM ())
updateRef
forall a. TVar a -> a -> STM ()
writeTVar TVar (b -> STM ())
updateRef \b
b -> do
b -> STM ()
update b
b
b -> STM ()
monitoring b
b
history
:: Incremental m b
-> STM (STM [b])
history :: forall (m :: Mutability) b. Incremental m b -> STM (STM [b])
history Incremental m b
i = do
b
x <- forall (m :: Mutability) a. Incremental m a -> STM a
observe Incremental m b
i
TVar [b]
h <- forall a. a -> STM (TVar a)
newTVar [b
x]
forall (m :: Mutability) b.
Incremental m b -> (b -> STM ()) -> STM ()
onUpdate Incremental m b
i \b
b -> do
[b]
bs <- forall a. TVar a -> STM a
readTVar TVar [b]
h
forall a. TVar a -> a -> STM ()
writeTVar TVar [b]
h (b
b forall a. a -> [a] -> [a]
: [b]
bs)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (forall a. TVar a -> STM a
readTVar TVar [b]
h)