{- | Support functions to call common live coding functionalities like launching and reloading
from a @ghci@ or @cabal repl@ session.
You typically don't need to import this module in your code,
but you should load it in your interactive session,
ideally by copying the file `essence-of-live-coding/.ghci` to your project,
adjusting it to your needs and launching @cabal repl@.
-}
module LiveCoding.GHCi where
-- base
import Control.Concurrent
-- foreign-store
import Foreign.Store
-- essence-of-live-coding
import LiveCoding.LiveProgram
import LiveCoding.RuntimeIO
import LiveCoding.RuntimeIO.Launch
livelaunch _ = return $ unlines
[ "launchedProgram <- launch liveProgram"
, "save launchedProgram"
]
livestop _ = return "stop launchedProgram"
-- | Load a 'LiveProgram' of a given type from the store.
-- The value of the given 'LiveProgram' is not used,
-- it only serves as a proxy for m.
load :: Launchable m => LiveProgram m -> IO (LaunchedProgram m)
load _ = readStore $ Store 0
-- | Save a 'LiveProgram' to the store.
save :: Launchable m => LaunchedProgram m -> IO ()
save = writeStore $ Store 0
-- TODO Could also parametrise this and all other commands by the 'liveProgram'
liveinit _ = return $ unlines
[ "programVar <- newMVar liveProgram"
, "threadId <- myThreadId"
, "save LaunchedProgram { .. }"
]
livereload _ = return $ unlines
[ ":reload"
, "launchedProgram <- load liveProgram"
, "update launchedProgram liveProgram"
]
livestep _ = return "stepLaunchedProgram launchedProgram"