Monitor musicplayer actor and stop main process when actor stops
This commit is contained in:
@@ -8,13 +8,14 @@ import musicplayer/ui/ui
|
||||
|
||||
pub fn main() -> Nil {
|
||||
let input_keys_name: Name(Key) = process.new_name("input_keys")
|
||||
|
||||
input.new(input_keys_name)
|
||||
|
||||
let assert Ok(ui) = ui.new()
|
||||
let assert Ok(mpv) = mpv.new()
|
||||
let assert Ok(musicplayer_pid) = musicplayer.new(ui, mpv, input_keys_name)
|
||||
|
||||
let exit = process.new_subject()
|
||||
let assert Ok(_) = musicplayer.new(ui, mpv, input_keys_name, exit)
|
||||
process.receive_forever(exit)
|
||||
let monitor = process.monitor(musicplayer_pid)
|
||||
process.new_selector()
|
||||
|> process.select_specific_monitor(monitor, fn(_) { Nil })
|
||||
|> process.selector_receive_forever
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import gleam/erlang/process.{type Name, type Subject}
|
||||
import gleam/erlang/process.{type Name, type Pid, type Subject}
|
||||
import gleam/otp/actor
|
||||
import gleam/result
|
||||
import gleam/string
|
||||
@@ -25,7 +25,6 @@ type State {
|
||||
input: Input,
|
||||
ui: Subject(ui_control.Control),
|
||||
mpv: Subject(mpv_control.Control),
|
||||
exit: Subject(Nil),
|
||||
)
|
||||
}
|
||||
|
||||
@@ -33,20 +32,19 @@ pub fn new(
|
||||
ui: Subject(ui_control.Control),
|
||||
mpv: Subject(mpv_control.Control),
|
||||
input_keys_name: Name(Key),
|
||||
exit: Subject(Nil),
|
||||
) -> Result(Nil, String) {
|
||||
) -> Result(Pid, String) {
|
||||
let input_keys = process.named_subject(input_keys_name)
|
||||
|
||||
let input = Input(False, "")
|
||||
|
||||
case
|
||||
actor.new(State(Idle, input, ui, mpv, exit))
|
||||
actor.new(State(Idle, input, ui, mpv))
|
||||
|> actor.on_message(handle_message)
|
||||
|> actor.start
|
||||
{
|
||||
Error(start_error) ->
|
||||
Error("Could not start actor: " <> string.inspect(start_error))
|
||||
Ok(actor.Started(data: musicplayer, ..)) -> {
|
||||
Ok(actor.Started(pid:, data: musicplayer)) -> {
|
||||
process.spawn(fn() {
|
||||
let assert Ok(_) = process.register(process.self(), input_keys_name)
|
||||
handle_key(musicplayer, input_keys)
|
||||
@@ -54,7 +52,7 @@ pub fn new(
|
||||
|
||||
process.spawn(fn() { update_playback_time_loop(mpv, ui, 1000) })
|
||||
|
||||
Ok(Nil)
|
||||
Ok(pid)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -117,8 +115,6 @@ fn handle_message(state: State, control: Control) -> actor.Next(State, Control)
|
||||
// Reset terminal state (show cursor etc.)
|
||||
process.call(state.ui, 1000, fn(reply_to) { ui_control.Exit(reply_to) })
|
||||
|
||||
// End main process
|
||||
process.send(state.exit, Nil)
|
||||
actor.stop()
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user