module AffBasics.SwitchingContexts where import Prelude import Effect (Effect) import Effect.Aff (Milliseconds(..), delay, joinFiber, launchAff, launchAff_, launchSuspendedAff) import Effect.Console (log) import SpecialLog (specialLog) -- This example was created to show what happens when `launchSuspendedAff` -- is used and its requirement to be run in another Aff computation later. -- -- It also shows the unpredictability of switching -- between the synchronous Effect and asychronous Aff in this way. main :: Effect Unit main = do let fiber1 = "Fiber 1" fiber2 = "Fiber 2" log "This is an Effect computation (Effect monadic context).\n" -- Runs an Aff computation and returns the fiber that, when joined, -- will produce the computed value. It must be joined in a new -- `Aff` computation. firstFiber <- launchAff do specialLog $ fiber1 <> ": You will only see this message once!" delay $ Milliseconds 1000.0 pure 10 -- Creates an Aff computation, but does not run it. Rather, returns -- the fiber that, when joined, will start and finish the computation, -- returning the computed value when done. It must be joined in a new -- `Aff` computation. secondFiber <- launchSuspendedAff do specialLog $ fiber2 <> ": You will only see this message once!" delay $ Milliseconds 1000.0 pure 50 log "\nJust some other stuff we need to do in the Effect monadic context...\n" launchAff_ do specialLog "Back inside an Aff monadic context. Let's see what those \ \fibers did!\n" result1 <- joinFiber firstFiber result2 <- joinFiber secondFiber specialLog "Finished joining fibers. After small pause, will join again \ \to see whether their computations are rerun." delay $ Milliseconds 2000.0 specialLog "Rejoining fibers!" result1_again <- joinFiber firstFiber result2_again <- joinFiber secondFiber specialLog "Finished joining fibers again." specialLog $ "Result 1 is the same? " <> show (result1 == result1_again) specialLog $ "Result 2 is the same? " <> show (result2 == result2_again) log "Back outside. Now in the Effect monadic context." log "=======================\n\ \The end of our code, but not the end of our program.\n\ \=======================\n"