module Process
( Id,
spawn,
sleep,
kill,
)
where
import Basics
import qualified Control.Concurrent
import qualified Control.Concurrent.Async as Async
import Internal.Shortcut
import qualified Platform.Internal as Internal
import qualified Result
import Task (Task)
import qualified Prelude
newtype Id = Id (Async.Async ())
spawn :: Task x a -> Task y Id
spawn :: Task x a -> Task y Id
spawn (Internal.Task LogHandler -> IO (Result x a)
f) =
(LogHandler -> IO (Result y Id)) -> Task y Id
forall x a. (LogHandler -> IO (Result x a)) -> Task x a
Internal.Task
( \LogHandler
handler ->
LogHandler -> IO (Result x a)
f LogHandler
handler
IO (Result x a)
-> (IO (Result x a) -> IO (Async (Result x a)))
-> IO (Async (Result x a))
forall a b. a -> (a -> b) -> b
|> IO (Result x a) -> IO (Async (Result x a))
forall a. IO a -> IO (Async a)
Async.async
IO (Async (Result x a))
-> (IO (Async (Result x a)) -> IO (Result y Id))
-> IO (Result y Id)
forall a b. a -> (a -> b) -> b
|> (Async (Result x a) -> Result y Id)
-> IO (Async (Result x a)) -> IO (Result y Id)
forall (m :: * -> *) a value.
Functor m =>
(a -> value) -> m a -> m value
map (Id -> Result y Id
forall error value. value -> Result error value
Result.Ok (Id -> Result y Id) -> (Async () -> Id) -> Async () -> Result y Id
forall b c a. (b -> c) -> (a -> b) -> a -> c
<< Async () -> Id
Id (Async () -> Result y Id)
-> (Async (Result x a) -> Async ())
-> Async (Result x a)
-> Result y Id
forall b c a. (b -> c) -> (a -> b) -> a -> c
<< (Result x a -> ()) -> Async (Result x a) -> Async ()
forall (m :: * -> *) a value.
Functor m =>
(a -> value) -> m a -> m value
map (\Result x a
_ -> ()))
)
sleep :: Float -> Task x ()
sleep :: Float -> Task x ()
sleep Float
delay = (LogHandler -> IO (Result x ())) -> Task x ()
forall x a. (LogHandler -> IO (Result x a)) -> Task x a
Internal.Task (\LogHandler
_ -> (() -> Result x ()) -> IO () -> IO (Result x ())
forall (m :: * -> *) a value.
Functor m =>
(a -> value) -> m a -> m value
map () -> Result x ()
forall error value. value -> Result error value
Result.Ok (Int -> IO ()
Control.Concurrent.threadDelay (Float -> Int
forall a b. (RealFrac a, Integral b) => a -> b
Prelude.floor (Float
delay Float -> Float -> Float
forall number. Num number => number -> number -> number
* Float
1000))))
kill :: Id -> Task x ()
kill :: Id -> Task x ()
kill (Id Async ()
async) = (LogHandler -> IO (Result x ())) -> Task x ()
forall x a. (LogHandler -> IO (Result x a)) -> Task x a
Internal.Task (\LogHandler
_ -> (() -> Result x ()) -> IO () -> IO (Result x ())
forall (m :: * -> *) a value.
Functor m =>
(a -> value) -> m a -> m value
map () -> Result x ()
forall error value. value -> Result error value
Result.Ok (Async () -> IO ()
forall a. Async a -> IO ()
Async.cancel Async ()
async))