mirror of
https://github.com/github/semantic.git
synced 2025-01-04 13:34:31 +03:00
Add Throw/Catch primitives to Task.
This commit is contained in:
parent
8043c3f472
commit
02779ee47e
@ -48,7 +48,7 @@ import qualified Data.Time.Clock.POSIX as Time (getCurrentTime)
|
|||||||
import qualified Data.Time.LocalTime as LocalTime
|
import qualified Data.Time.LocalTime as LocalTime
|
||||||
import Data.Union
|
import Data.Union
|
||||||
import Diff
|
import Diff
|
||||||
import Info
|
import Info hiding (Category(..))
|
||||||
import qualified Files
|
import qualified Files
|
||||||
import GHC.Conc (atomically)
|
import GHC.Conc (atomically)
|
||||||
import Language
|
import Language
|
||||||
@ -75,6 +75,10 @@ data TaskF output where
|
|||||||
-- | For MonadIO.
|
-- | For MonadIO.
|
||||||
LiftIO :: IO a -> TaskF a
|
LiftIO :: IO a -> TaskF a
|
||||||
|
|
||||||
|
-- | For MonadError.
|
||||||
|
Throw :: String -> TaskF a
|
||||||
|
Catch :: Task a -> (String -> Task a) -> TaskF a
|
||||||
|
|
||||||
-- | A high-level task producing some result, e.g. parsing, diffing, rendering. 'Task's can also specify explicit concurrency via 'distribute', 'distributeFor', and 'distributeFoldMap'
|
-- | A high-level task producing some result, e.g. parsing, diffing, rendering. 'Task's can also specify explicit concurrency via 'distribute', 'distributeFor', and 'distributeFoldMap'
|
||||||
type Task = Freer TaskF
|
type Task = Freer TaskF
|
||||||
|
|
||||||
@ -182,7 +186,13 @@ runTaskWithOptions options task = do
|
|||||||
Diff differ terms -> pure (differ terms) >>= yield
|
Diff differ terms -> pure (differ terms) >>= yield
|
||||||
Render renderer input -> pure (renderer input) >>= yield
|
Render renderer input -> pure (renderer input) >>= yield
|
||||||
Distribute tasks -> Async.mapConcurrently go tasks >>= either (pure . Left) yield . sequenceA . withStrategy (parTraversable (parTraversable rseq))
|
Distribute tasks -> Async.mapConcurrently go tasks >>= either (pure . Left) yield . sequenceA . withStrategy (parTraversable (parTraversable rseq))
|
||||||
LiftIO action -> action >>= yield ) . fmap Right
|
LiftIO action -> action >>= yield
|
||||||
|
Throw err -> pure (Left err)
|
||||||
|
Catch during handler -> do
|
||||||
|
result <- go during
|
||||||
|
case result of
|
||||||
|
Left err -> go (handler err) >>= either (pure . Left) yield
|
||||||
|
Right a -> yield a) . fmap Right
|
||||||
queueLogMessage level message pairs
|
queueLogMessage level message pairs
|
||||||
| Just logLevel <- optionsLevel options, level <= logLevel = Time.getCurrentTime >>= LocalTime.utcToLocalZonedTime >>= atomically . writeTMQueue logQueue . Message level message pairs
|
| Just logLevel <- optionsLevel options, level <= logLevel = Time.getCurrentTime >>= LocalTime.utcToLocalZonedTime >>= atomically . writeTMQueue logQueue . Message level message pairs
|
||||||
| otherwise = pure ()
|
| otherwise = pure ()
|
||||||
|
Loading…
Reference in New Issue
Block a user