Skip to content

General errors #177

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
aa162d2
CHG: Fibers enter WAITING state after an async result is received.
eric-corumdigital Feb 5, 2019
37a9af9
FIX
eric-corumdigital Feb 5, 2019
1c41cee
FIX
eric-corumdigital Feb 5, 2019
f2d414b
FIX
eric-corumdigital Feb 5, 2019
24d2568
FIX
eric-corumdigital Feb 5, 2019
206f3b9
FIX
eric-corumdigital Feb 5, 2019
bccb409
FIX: Fixed memory leak on V8
eric-corumdigital Feb 7, 2019
127fd21
CHG: trying something other than setTimeout to fix V8 memory leak
eric-corumdigital Feb 7, 2019
e03b941
FIX: Memory leak in V8 caused by new Error object
eric-corumdigital Feb 8, 2019
38fa57a
CHG: Simplified case ASYNC state.
eric-corumdigital Feb 8, 2019
3601775
FIX: moved two more Error instantiations outside of Aff.
eric-corumdigital May 13, 2019
a99e896
FIX: added error back to exports, fixed compile error
eric-corumdigital May 13, 2019
2f4b9a5
CHG: Generalised Aff for arbitrary error types; not backwards
eric-corumdigital Aug 3, 2019
aa68070
CHG: Moved generalised error implementation; put a better
eric-corumdigital Aug 27, 2019
ba47609
ADD: Observable Fiber status.
eric-corumdigital Aug 28, 2019
9899ce3
ADD: Explicit panics ADD: Bifunctor instance for Aff
eric-corumdigital Aug 30, 2019
a2f1049
FIX: imported wrong Error
eric-corumdigital Sep 6, 2019
648870d
ADD: Free Newtype conversions for Bifunctors.
eric-corumdigital Sep 6, 2019
c7d9b74
ADD: Type-proxied versions of free Bifunctor Newtype conversions.
eric-corumdigital Sep 6, 2019
18d7621
CHG: Use newtype constructor to type hint rather than Proxy.
eric-corumdigital Sep 6, 2019
09223d4
WIP FIX: joining on interrupted Fibers must panic.
eric-corumdigital Sep 9, 2019
7eb007e
FIX: unsafeFromSucceeded Interrupt error
eric-corumdigital Sep 10, 2019
0d7c02c
FIX: Supervisor leaks memory by not unregistering Fibers in COMPLETE
eric-corumdigital Sep 11, 2019
9e1e64b
Merge branch 'fix_supervisor_leak' of github.com:eric-corumdigital/pu…
eric-corumdigital Sep 11, 2019
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
580 changes: 178 additions & 402 deletions src/Effect/Aff.purs

Large diffs are not rendered by default.

87 changes: 43 additions & 44 deletions src/Effect/Aff/Class.purs
Original file line number Diff line number Diff line change
@@ -1,44 +1,43 @@
module Effect.Aff.Class where

import Prelude
import Control.Monad.Cont.Trans (ContT)
import Control.Monad.Except.Trans (ExceptT)
import Control.Monad.List.Trans (ListT)
import Control.Monad.Maybe.Trans (MaybeT)
import Control.Monad.Reader.Trans (ReaderT)
import Control.Monad.RWS.Trans (RWST)
import Control.Monad.State.Trans (StateT)
import Control.Monad.Trans.Class (lift)
import Control.Monad.Writer.Trans (WriterT)
import Effect.Aff (Aff)
import Effect.Class (class MonadEffect)

class MonadEffect m ⇐ MonadAff m where
liftAff ∷ Aff ~> m

instance monadAffAff ∷ MonadAff Aff where
liftAff = identity

instance monadAffContT ∷ MonadAff m ⇒ MonadAff (ContT r m) where
liftAff = lift <<< liftAff

instance monadAffExceptT ∷ MonadAff m ⇒ MonadAff (ExceptT e m) where
liftAff = lift <<< liftAff

instance monadAffListT ∷ MonadAff m ⇒ MonadAff (ListT m) where
liftAff = lift <<< liftAff

instance monadAffMaybe ∷ MonadAff m ⇒ MonadAff (MaybeT m) where
liftAff = lift <<< liftAff

instance monadAffReader ∷ MonadAff m ⇒ MonadAff (ReaderT r m) where
liftAff = lift <<< liftAff

instance monadAffRWS ∷ (MonadAff m, Monoid w) ⇒ MonadAff (RWST r w s m) where
liftAff = lift <<< liftAff

instance monadAffState ∷ MonadAff m ⇒ MonadAff (StateT s m) where
liftAff = lift <<< liftAff

instance monadAffWriter ∷ (MonadAff m, Monoid w) ⇒ MonadAff (WriterT w m) where
liftAff = lift <<< liftAff
module Effect.Aff.Class where

import Control.Monad.Cont (ContT, lift)
import Control.Monad.Except (ExceptT)
import Control.Monad.List.Trans (ListT)
import Control.Monad.Maybe.Trans (MaybeT)
import Control.Monad.RWS (RWST)
import Control.Monad.Reader (ReaderT)
import Control.Monad.State (StateT)
import Control.Monad.Writer (WriterT)
import Effect.Aff.General (Aff, Error)
import Effect.Class (class MonadEffect)
import Prelude (class Monoid, type (~>), identity, (<<<))

class MonadEffect m ⇐ MonadAff m where
liftAff ∷ Aff Error ~> m

instance monadAffAff ∷ MonadAff (Aff Error) where
liftAff = identity

instance monadAffContT ∷ MonadAff m ⇒ MonadAff (ContT r m) where
liftAff = lift <<< liftAff

instance monadAffExceptT ∷ MonadAff m ⇒ MonadAff (ExceptT Error m) where
liftAff = lift <<< liftAff

instance monadAffListT ∷ MonadAff m ⇒ MonadAff (ListT m) where
liftAff = lift <<< liftAff

instance monadAffMaybe ∷ MonadAff m ⇒ MonadAff (MaybeT m) where
liftAff = lift <<< liftAff

instance monadAffReader ∷ MonadAff m ⇒ MonadAff (ReaderT r m) where
liftAff = lift <<< liftAff

instance monadAffRWS ∷ (MonadAff m, Monoid w) ⇒ MonadAff (RWST r w s m) where
liftAff = lift <<< liftAff

instance monadAffState ∷ MonadAff m ⇒ MonadAff (StateT s m) where
liftAff = lift <<< liftAff

instance monadAffWriter ∷ (MonadAff m, Monoid w) ⇒ MonadAff (WriterT w m) where
liftAff = lift <<< liftAff
77 changes: 24 additions & 53 deletions src/Effect/Aff/Compat.purs
Original file line number Diff line number Diff line change
@@ -1,53 +1,24 @@
-- | This module provides compatability functions for constructing `Aff`s which
-- | are defined via the FFI.
module Effect.Aff.Compat
( EffectFnAff(..)
, EffectFnCanceler(..)
, EffectFnCb
, fromEffectFnAff
, module Effect.Uncurried
) where

import Prelude
import Data.Either (Either(..))
import Effect.Aff (Aff, Canceler(..), makeAff, nonCanceler)
import Effect.Exception (Error)
import Effect.Uncurried (EffectFn1, EffectFn2, EffectFn3, mkEffectFn1, mkEffectFn2, mkEffectFn3, runEffectFn1, runEffectFn2, runEffectFn3)

type EffectFnCb a = EffectFn1 a Unit

newtype EffectFnAff a = EffectFnAff (EffectFn2 (EffectFnCb Error) (EffectFnCb a) EffectFnCanceler)

newtype EffectFnCanceler = EffectFnCanceler (EffectFn3 Error (EffectFnCb Error) (EffectFnCb Unit) Unit)

-- | Lift a FFI definition into an `Aff`. `EffectFnAff` makes use of `EffectFn` so
-- | `Effect` thunks are unnecessary. A definition might follow this example:
-- |
-- | ```javascript
-- | exports._myAff = function (onError, onSuccess) {
-- | var cancel = doSomethingAsync(function (err, res) {
-- | if (err) {
-- | onError(err);
-- | } else {
-- | onSuccess(res);
-- | }
-- | });
-- | return function (cancelError, onCancelerError, onCancelerSuccess) {
-- | cancel();
-- | onCancelerSuccess();
-- | };
-- | };
-- | ```
-- |
-- | ```purescript
-- | foreign import _myAff :: EffectFnAff String
-- |
-- | myAff :: Aff String
-- | myAff = fromEffectFnAff _myAff
-- | ````
fromEffectFnAff ∷ EffectFnAff ~> Aff
fromEffectFnAff (EffectFnAff eff) = makeAff \k → do
EffectFnCanceler canceler ← runEffectFn2 eff (mkEffectFn1 (k <<< Left)) (mkEffectFn1 (k <<< Right))
pure $ Canceler \e → makeAff \k2 → do
runEffectFn3 canceler e (mkEffectFn1 (k2 <<< Left)) (mkEffectFn1 (k2 <<< Right))
pure nonCanceler
module Effect.Aff.Compat
( EffectFnAff
, EffectFnCanceler
, fromEffectFnAff
, module Effect.Uncurried
, module Exports
) where

import Effect.Aff (Aff, Error)
import Effect.Aff.General.Compat (EffectFnCb) as Exports
import Effect.Aff.General.Compat as G
import Effect.Uncurried (EffectFn1, EffectFn2, EffectFn3, mkEffectFn1, mkEffectFn2, mkEffectFn3, runEffectFn1, runEffectFn2, runEffectFn3)
import Prelude (type (~>))

type EffectFnCb a = G.EffectFnCb a

newtype EffectFnAff a = EffectFnAff
(EffectFn2 (EffectFnCb Error) (EffectFnCb a) EffectFnCanceler)

type EffectFnCanceler = G.EffectFnCanceler

fromEffectFnAff ∷ EffectFnAff ~> Aff
fromEffectFnAff (EffectFnAff f) =
G.fromEffectFnAff (G.EffectFnAff (mkEffectFn3 \a b _ → runEffectFn2 f a b))
Loading