generated from tpl/purs
fix: impl monadrec
This commit is contained in:
parent
02add2653a
commit
5a99e58062
@ -32,6 +32,7 @@ workspace:
|
||||
- record: ">=4.0.0 <5.0.0"
|
||||
- simple-json: ">=9.0.0 <10.0.0"
|
||||
- strings: ">=6.0.1 <7.0.0"
|
||||
- tailrec
|
||||
- transformers: ">=6.0.0 <7.0.0"
|
||||
- tuples: ">=7.0.0 <8.0.0"
|
||||
- typelevel-prelude: ">=7.0.0 <8.0.0"
|
||||
|
@ -13,6 +13,7 @@ package:
|
||||
strict: true
|
||||
pedanticPackages: true
|
||||
dependencies:
|
||||
- tailrec
|
||||
- aff: ">=7.1.0 <8.0.0"
|
||||
- aff-promise: ">=4.0.0 <5.0.0"
|
||||
- arrays: ">=7.3.0 <8.0.0"
|
||||
|
@ -9,6 +9,7 @@ import Control.Monad.Fork.Class (class MonadBracket, class MonadFork, class Mona
|
||||
import Control.Monad.Morph (class MFunctor, class MMonad)
|
||||
import Control.Monad.Postgres.Session (class MonadSession, SessionT, exec, exec_, query)
|
||||
import Control.Monad.Reader (class MonadAsk, class MonadReader, ReaderT, ask, local, runReaderT)
|
||||
import Control.Monad.Rec.Class (class MonadRec)
|
||||
import Control.Monad.Trans.Class (class MonadTrans, lift)
|
||||
import Control.Parallel (class Parallel, parallel, sequential)
|
||||
import Data.Newtype (class Newtype, unwrap, wrap)
|
||||
@ -57,6 +58,7 @@ derive newtype instance (Bind m) => Bind (PostgresT m)
|
||||
derive newtype instance (Monad m) => Monad (PostgresT m)
|
||||
derive newtype instance (MonadEffect m) => MonadEffect (PostgresT m)
|
||||
derive newtype instance (MonadAff m) => MonadAff (PostgresT m)
|
||||
derive newtype instance MonadRec m => MonadRec (PostgresT m)
|
||||
derive newtype instance MonadTrans (PostgresT)
|
||||
derive newtype instance (MonadThrow e m) => MonadThrow e (PostgresT m)
|
||||
derive newtype instance (MonadError e m) => MonadError e (PostgresT m)
|
||||
|
@ -9,6 +9,7 @@ import Control.Monad.Fork.Class (class MonadBracket, class MonadFork, class Mona
|
||||
import Control.Monad.Postgres.Base (PostgresT, transaction)
|
||||
import Control.Monad.Postgres.Session (class MonadSession, SessionT, exec, exec_, query)
|
||||
import Control.Monad.Reader (class MonadAsk, class MonadReader, ReaderT, ask, local, runReaderT)
|
||||
import Control.Monad.Rec.Class (class MonadRec)
|
||||
import Control.Monad.Trans.Class (class MonadTrans, lift)
|
||||
import Control.Parallel (class Parallel, parallel, sequential)
|
||||
import Data.Array as Array
|
||||
@ -38,6 +39,7 @@ derive newtype instance (Bind m) => Bind (CursorT t m)
|
||||
derive newtype instance (Monad m) => Monad (CursorT t m)
|
||||
derive newtype instance (MonadEffect m) => MonadEffect (CursorT t m)
|
||||
derive newtype instance (MonadAff m) => MonadAff (CursorT t m)
|
||||
derive newtype instance MonadRec m => MonadRec (CursorT t m)
|
||||
derive newtype instance MonadTrans (CursorT t)
|
||||
derive newtype instance (MonadThrow e m) => MonadThrow e (CursorT t m)
|
||||
derive newtype instance (MonadError e m) => MonadError e (CursorT t m)
|
||||
|
@ -13,15 +13,15 @@ import Effect.Class (liftEffect)
|
||||
import Foreign (ForeignError(..))
|
||||
|
||||
-- | Monad used to incrementally deserialize columns from a row
|
||||
type Unresult a = StateT {ix :: Int, row :: Array Raw} RepT a
|
||||
type Unresult a = StateT { ix :: Int, row :: Array Raw } RepT a
|
||||
|
||||
-- | Run an `UnresultT`
|
||||
unresult :: forall a. Unresult a -> Array Raw -> RepT a
|
||||
unresult m row = fst <$> runStateT m {ix: 0, row}
|
||||
unresult m row = fst <$> runStateT m { ix: 0, row }
|
||||
|
||||
-- | Take the next column from the row, unmarshalling into `a`
|
||||
take :: forall a. Deserialize a => Unresult a
|
||||
take = do
|
||||
raw <- state (\r -> Array.index r.row r.ix /\ r {ix = r.ix + 1})
|
||||
raw <- state (\r -> Array.index r.row r.ix /\ r { ix = r.ix + 1 })
|
||||
raw' <- liftMaybe (pure $ ForeignError $ "Ran out of columns!") raw
|
||||
liftEffect $ smash $ deserialize raw'
|
||||
|
Loading…
Reference in New Issue
Block a user