52 lines
1.1 KiB
Gleam
52 lines
1.1 KiB
Gleam
import gleam/erlang/process
|
|
import gleam/list
|
|
import gleam/otp/actor
|
|
import sensors
|
|
|
|
pub type Subscriber =
|
|
process.Subject(sensors.SensorReading)
|
|
|
|
pub type Message {
|
|
Subscribe(subscriber: Subscriber)
|
|
Proc
|
|
}
|
|
|
|
pub type Subscribers =
|
|
List(Subscriber)
|
|
|
|
fn handle_message(
|
|
subscribers: Subscribers,
|
|
message: Message,
|
|
) -> actor.Next(Subscribers, Message) {
|
|
case message {
|
|
Subscribe(subscriber) -> {
|
|
let new_subscribers = [subscriber, ..subscribers]
|
|
actor.continue(new_subscribers)
|
|
}
|
|
Proc -> {
|
|
list.each(subscribers, fn(subscriber) {
|
|
process.send(
|
|
subscriber,
|
|
sensors.SensorReading(sensors.Temperature, 26.6),
|
|
)
|
|
})
|
|
actor.continue(subscribers)
|
|
}
|
|
}
|
|
}
|
|
|
|
// Subscribe to receive ticks from the dummy actor
|
|
pub fn subscribe(actor_ref: process.Subject(Message)) -> Subscriber {
|
|
let mailbox = process.new_subject()
|
|
process.send(actor_ref, Subscribe(mailbox))
|
|
mailbox
|
|
}
|
|
|
|
// Start the actor
|
|
pub fn start() -> Result(process.Subject(Message), actor.StartError) {
|
|
let assert Ok(started) =
|
|
actor.new([])
|
|
|> actor.on_message(handle_message)
|
|
|> actor.start
|
|
Ok(started.data)
|
|
}
|