Skip to content

Commit

Permalink
Add PrimMonad instances for newtypes
Browse files Browse the repository at this point in the history
  • Loading branch information
j-mueller committed Sep 25, 2024
1 parent af2f65a commit 85b1365
Show file tree
Hide file tree
Showing 11 changed files with 67 additions and 3 deletions.
1 change: 1 addition & 0 deletions src/base/convex-base.cabal
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ library
exceptions,
time,
either-result,
primitive,
QuickCheck

build-depends:
Expand Down
7 changes: 7 additions & 0 deletions src/base/lib/Convex/BuildTx.hs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE NumericUnderscores #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE ViewPatterns #-}
{-| Building transactions
Expand Down Expand Up @@ -111,6 +112,7 @@ import Control.Lens (_1, _2, at, mapped, over, set,
view, (&))
import qualified Control.Lens as L
import Control.Monad.Except (MonadError (..))
import Control.Monad.Primitive (PrimMonad (..))
import Control.Monad.Reader.Class (MonadReader (..))
import qualified Control.Monad.State as LazyState
import Control.Monad.State.Class (MonadState (..))
Expand Down Expand Up @@ -254,6 +256,11 @@ addBtx = addTxBuilder . TxBuilder . const
newtype BuildTxT m a = BuildTxT{unBuildTxT :: WriterT TxBuilder m a }
deriving newtype (Functor, Applicative, Monad)

instance PrimMonad m => PrimMonad (BuildTxT m) where
type PrimState (BuildTxT m) = PrimState m
{-# INLINEABLE primitive #-}
primitive f = lift (primitive f)

instance MonadTrans BuildTxT where
lift = BuildTxT . lift

Expand Down
7 changes: 7 additions & 0 deletions src/base/lib/Convex/Class.hs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE ViewPatterns #-}
{-| Typeclasses for blockchain operations
Expand Down Expand Up @@ -108,6 +109,7 @@ import Control.Monad.Except (MonadError,
runExceptT,
throwError)
import Control.Monad.IO.Class (MonadIO (..))
import Control.Monad.Primitive (PrimMonad (..))
import Control.Monad.Reader (MonadTrans,
ReaderT (..),
ask, asks,
Expand Down Expand Up @@ -482,6 +484,11 @@ instance Monad m => MonadError e (MonadBlockchainCardanoNodeT e m) where
throwError = MonadBlockchainCardanoNodeT . throwError . MonadBlockchainError
catchError (MonadBlockchainCardanoNodeT action) handler = MonadBlockchainCardanoNodeT $ catchError action (\case { MonadBlockchainError e -> unMonadBlockchainCardanoNodeT (handler e); e' -> throwError e' })

instance PrimMonad m => PrimMonad (MonadBlockchainCardanoNodeT e m) where
type PrimState (MonadBlockchainCardanoNodeT e m) = PrimState m
{-# INLINEABLE primitive #-}
primitive f = lift (primitive f)

runMonadBlockchainCardanoNodeT :: LocalNodeConnectInfo -> MonadBlockchainCardanoNodeT e m a -> m (Either (MonadBlockchainError e) a)
runMonadBlockchainCardanoNodeT info (MonadBlockchainCardanoNodeT action) = runExceptT (runReaderT action info)

Expand Down
13 changes: 13 additions & 0 deletions src/base/lib/Convex/MonadLog.hs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE UndecidableInstances #-}
{-| Simple logging
-}
Expand Down Expand Up @@ -27,6 +28,7 @@ import Control.Monad.Catch (MonadCatch, MonadMask, MonadThrow,
bracket)
import Control.Monad.Except (MonadError)
import Control.Monad.IO.Class (MonadIO (..))
import Control.Monad.Primitive (PrimMonad (..))
import Control.Monad.Reader (ReaderT (..))
import Control.Monad.State (StateT (..))
import qualified Control.Monad.State.Strict as State.Strict
Expand Down Expand Up @@ -119,6 +121,12 @@ instance Monad m => MonadLog (MonadLogIgnoreT m) where
logWarn' _ = pure ()
logDebug' _ = pure ()

instance PrimMonad m => PrimMonad (MonadLogIgnoreT m) where
type PrimState (MonadLogIgnoreT m) = PrimState m
{-# INLINEABLE primitive #-}
primitive f = lift (primitive f)


-- | 'MonadLog' implementation that uses a @katip@ backend
newtype MonadLogKatipT m a = MonadLogKatipT { runMonadLogKatipT :: KatipContextT m a }
deriving newtype (Functor, Applicative, Monad, MonadIO, MonadCatch, MonadThrow, MonadMask, MonadFail)
Expand All @@ -130,6 +138,11 @@ runMonadLogKatip (env, context, ns) (MonadLogKatipT action) =

deriving newtype instance MonadError e m => MonadError e (MonadLogKatipT m)

instance PrimMonad m => PrimMonad (MonadLogKatipT m) where
type PrimState (MonadLogKatipT m) = PrimState m
{-# INLINEABLE primitive #-}
primitive f = lift (primitive f)

instance MonadTrans MonadLogKatipT where
lift = MonadLogKatipT . lift

Expand Down
1 change: 1 addition & 0 deletions src/coin-selection/convex-coin-selection.cabal
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ library
convex-optics,
convex-wallet,
data-default,
primitive,
servant-client,
text

Expand Down
12 changes: 12 additions & 0 deletions src/coin-selection/lib/Convex/CoinSelection/Class.hs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE UndecidableInstances #-}
{-| An effect for balancing transactions
-}
Expand All @@ -19,6 +20,7 @@ import Control.Monad.Catch (MonadCatch, MonadMask,
import Control.Monad.Except (ExceptT, MonadError,
runExceptT)
import Control.Monad.IO.Class (MonadIO)
import Control.Monad.Primitive (PrimMonad (..))
import Control.Monad.Reader (ReaderT (runReaderT), ask)
import Control.Monad.Trans.Class (MonadTrans (..))
import qualified Control.Monad.Trans.State as StrictState
Expand Down Expand Up @@ -73,6 +75,11 @@ class Monad m => MonadBalance m where
newtype BalancingT m a = BalancingT{runBalancingT :: m a }
deriving newtype (Functor, Applicative, Monad, MonadIO, MonadCatch, MonadFail, MonadLog, MonadThrow, MonadMask, MonadBlockchain)

instance PrimMonad m => PrimMonad (BalancingT m) where
type PrimState (BalancingT m) = PrimState m
{-# INLINEABLE primitive #-}
primitive f = lift (primitive f)

instance MonadTrans BalancingT where
lift = BalancingT

Expand Down Expand Up @@ -111,6 +118,11 @@ instance MonadDatumQuery m => MonadDatumQuery (BalancingT m) where
newtype TracingBalancingT m a = TracingBalancingT{ runTracingBalancingT' :: ReaderT (Tracer m TxBalancingMessage) m a }
deriving newtype (Functor, Applicative, Monad, MonadIO, MonadCatch, MonadFail, MonadLog, MonadThrow, MonadMask, MonadBlockchain)

instance PrimMonad m => PrimMonad (TracingBalancingT m) where
type PrimState (TracingBalancingT m) = PrimState m
{-# INLINEABLE primitive #-}
primitive f = lift (primitive f)

instance MonadTrans TracingBalancingT where
lift = TracingBalancingT . lift

Expand Down
9 changes: 8 additions & 1 deletion src/coin-selection/lib/Convex/Query.hs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE UndecidableInstances #-}
{-| Custom class to encapsulate the general purpose
queries that we need for building transactions
Expand Down Expand Up @@ -30,6 +31,7 @@ import Cardano.Api (BalancedTxBody, ConwayEra,
import qualified Cardano.Api as C
import Control.Monad.Except (MonadError)
import Control.Monad.IO.Class (MonadIO (..))
import Control.Monad.Primitive (PrimMonad (..))
import Control.Monad.Reader (ReaderT, ask, runReaderT)
import Control.Monad.Trans.Class (MonadTrans (..))
import Control.Monad.Trans.Except (runExceptT)
Expand Down Expand Up @@ -74,7 +76,12 @@ balanceTx dbg inputCredentials changeOutput txBody changePosition = do
runExceptT (Convex.CoinSelection.balanceTx (natTracer lift dbg) changeOutput o txBody changePosition)

newtype WalletAPIQueryT m a = WalletAPIQueryT{ runWalletAPIQueryT_ :: ReaderT ClientEnv m a }
deriving newtype (Functor, Applicative, Monad, MonadIO, MonadBlockchain, MonadLog)
deriving newtype (Functor, Applicative, Monad, MonadIO, MonadBlockchain, MonadLog, MonadTrans)

instance PrimMonad m => PrimMonad (WalletAPIQueryT m) where
type PrimState (WalletAPIQueryT m) = PrimState m
{-# INLINEABLE primitive #-}
primitive f = lift (primitive f)

runWalletAPIQueryT :: ClientEnv -> WalletAPIQueryT m a -> m a
runWalletAPIQueryT env (WalletAPIQueryT action) = runReaderT action env
Expand Down
3 changes: 2 additions & 1 deletion src/mockchain/convex-mockchain.cabal
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,8 @@ library
strict-sop-core,
sop-core,
template-haskell,
aeson
aeson,
primitive

-- cardano dependencies
build-depends:
Expand Down
7 changes: 7 additions & 0 deletions src/mockchain/lib/Convex/MockChain.hs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE ViewPatterns #-}
{-| Minimal mockchain
Expand Down Expand Up @@ -114,6 +115,7 @@ import Control.Monad.Except (ExceptT,
MonadError (throwError),
runExceptT)
import Control.Monad.IO.Class (MonadIO)
import Control.Monad.Primitive (PrimMonad (..))
import Control.Monad.Reader (MonadReader, ReaderT,
ask, asks, local,
runReaderT)
Expand Down Expand Up @@ -361,6 +363,11 @@ applyTx params oldState@MockChainState{mcsEnv, mcsPoolState} tx context = do
newtype MockchainT m a = MockchainT (ReaderT NodeParams (StateT MockChainState (ExceptT MockchainError m)) a)
deriving newtype (Functor, Applicative, Monad, MonadIO, MonadLog)

instance PrimMonad m => PrimMonad (MockchainT m) where
type PrimState (MockchainT m) = PrimState m
{-# INLINEABLE primitive #-}
primitive f = lift (primitive f)

instance MonadTrans MockchainT where
lift = MockchainT . lift . lift . lift

Expand Down
3 changes: 2 additions & 1 deletion src/node-client/convex-node-client.cabal
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,8 @@ library
containers,
aeson,
stm,
mtl
mtl,
primitive

build-depends:
convex-base
Expand Down
7 changes: 7 additions & 0 deletions src/node-client/lib/Convex/NodeClient/WaitForTxnClient.hs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE UndecidableInstances #-}
{-| A node client that waits for a transaction to appear on the chain
-}
Expand All @@ -19,6 +20,7 @@ import Control.Concurrent.STM (TMVar, atomically, newEmptyTMVar,
putTMVar, takeTMVar)
import Control.Monad.Except (MonadError (..))
import Control.Monad.IO.Class (MonadIO (..))
import Control.Monad.Primitive (PrimMonad (..))
import Control.Monad.Reader (MonadTrans, ReaderT (..), ask,
lift)
import Convex.Class (MonadBlockchain (..),
Expand Down Expand Up @@ -69,6 +71,11 @@ checkTxId txi tx = txi == C.getTxId (C.getTxBody tx)
newtype MonadBlockchainWaitingT m a = MonadBlockchainWaitingT{unMonadBlockchainWaitingT :: ReaderT (LocalNodeConnectInfo, Env) m a }
deriving newtype (Functor, Applicative, Monad, MonadIO, MonadFail, MonadUtxoQuery, MonadDatumQuery)

instance PrimMonad m => PrimMonad (MonadBlockchainWaitingT m) where
type PrimState (MonadBlockchainWaitingT m) = PrimState m
{-# INLINEABLE primitive #-}
primitive f = lift (primitive f)

runMonadBlockchainWaitingT :: LocalNodeConnectInfo -> Env -> MonadBlockchainWaitingT m a -> m a
runMonadBlockchainWaitingT connectInfo env (MonadBlockchainWaitingT action) = runReaderT action (connectInfo, env)

Expand Down

0 comments on commit 85b1365

Please sign in to comment.