33//// automatically delist dead processes.
44
55import gleam/dynamic
6- import gleam/erlang
76import gleam/erlang/atom
87import gleam/erlang/process . { type Pid , type Subject }
9- import gleam/function
8+ import gleam/erlang/reference . { type Reference }
109import gleam/otp/actor
1110import gleam/result . { try }
1211import lamb . { Bag , Private , Protected , Public , Set }
@@ -47,9 +46,12 @@ pub type Named {
4746/// ```gleam
4847/// > let _ = chip.start(chip.Named("sessions"))
4948/// ```
50- pub fn start ( named : Named ) -> Result ( Registry ( msg, group) , actor . StartError ) {
51- let init = fn ( ) { init ( named ) }
52- actor . start_spec ( actor . Spec ( init : init , init_timeout : 100 , loop : loop ) )
49+ pub fn start ( named : Named )
50+ -> Result ( actor . Started ( Subject ( Message ( a, b) ) ) , actor . StartError ) {
51+ let init = fn ( self ) { init ( self , named ) }
52+ actor . new_with_initialiser ( 100 , init )
53+ |> actor . on_message ( loop )
54+ |> actor . start ( )
5355}
5456
5557/// Retrieves a previously named registry.
@@ -139,7 +141,7 @@ pub fn members(
139141 group : group,
140142 timeout : Int ,
141143) -> List ( Subject ( msg) ) {
142- let group_store = process . call ( registry , GroupStore2 ( _ ) , timeout )
144+ let group_store = process . call ( registry , timeout , GroupStore2 )
143145
144146 lamb . lookup ( group_store , group )
145147}
@@ -159,7 +161,7 @@ pub fn stop(registry: Registry(msg, group)) -> Nil {
159161// Server Code ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
160162
161163type Monitor =
162- erlang . Reference
164+ Reference
163165
164166/// Chip's internal message type.
165167pub opaque type Message ( msg, group) {
@@ -185,10 +187,8 @@ type ProcessDown {
185187 ProcessDown ( monitor : Monitor , pid : Pid )
186188}
187189
188- fn init (
189- named : Named ,
190- ) -> actor . InitResult ( State ( msg, group) , Message ( msg, group) ) {
191- let self = process . new_subject ( )
190+ fn init ( self , named : Named ) {
191+ //let self = process.new_subject()
192192
193193 let table = initialize_named_registries_store ( )
194194
@@ -206,16 +206,19 @@ fn init(
206206
207207 let selector =
208208 process . new_selector ( )
209- |> process . selecting ( self , function . identity )
210- |> process . selecting_anything ( process_down )
209+ |> process . select ( self )
210+ |> process . select_other ( process_down )
211211
212- actor . Ready ( state , selector )
212+ actor . initialised ( state )
213+ |> actor . selecting ( selector )
214+ |> actor . returning ( self )
215+ |> Ok
213216}
214217
215218fn loop (
216- message : Message ( msg, group) ,
217219 state : State ( msg, group) ,
218- ) -> actor . Next ( Message ( msg, group) , State ( msg, group) ) {
220+ message : Message ( msg, group) ,
221+ ) -> actor . Next ( State ( msg, group) , Message ( msg, group) ) {
219222 case message {
220223 GroupStore2 ( client ) -> {
221224 // priority is given through selective receive
@@ -228,9 +231,15 @@ fn loop(
228231 Register ( subject , group ) -> {
229232 let pid = process . subject_owner ( subject )
230233
231- let Nil = monitor ( state . monitors , pid )
232- lamb . insert ( state . monitors , pid , Nil )
233- lamb . insert ( state . groups , group , subject )
234+ case pid {
235+ Ok ( pid ) -> {
236+ let Nil = monitor ( state . monitors , pid )
237+ lamb . insert ( state . monitors , pid , Nil )
238+ lamb . insert ( state . groups , group , subject )
239+ }
240+ Error ( _ ) -> Nil
241+ //TODO what do we want to do in this case?
242+ }
234243
235244 state
236245 |> actor . continue ( )
@@ -256,7 +265,7 @@ fn loop(
256265 }
257266
258267 Stop -> {
259- actor . Stop ( process . Normal )
268+ actor . stop ( )
260269 }
261270 }
262271}
@@ -311,7 +320,7 @@ fn monitor(monitors: lamb.Table(Pid, Nil), pid: Pid) -> Nil {
311320 case lamb . any ( monitors , pid ) {
312321 True -> Nil
313322 False -> {
314- let _monitor = process . monitor_process ( pid )
323+ let _monitor = process . monitor ( pid )
315324 Nil
316325 }
317326 }
@@ -321,7 +330,7 @@ fn monitor(monitors: lamb.Table(Pid, Nil), pid: Pid) -> Nil {
321330fn decode_down_message ( message : dynamic . Dynamic ) -> Result ( ProcessDown , Nil )
322331
323332fn schedulers ( ) -> Int {
324- ffi_system_info ( atom . create_from_string ( "schedulers" ) )
333+ ffi_system_info ( atom . create ( "schedulers" ) )
325334}
326335
327336type Option =
@@ -331,7 +340,7 @@ type Option =
331340fn ffi_system_info ( option : Option ) -> Int
332341
333342fn demonitor ( reference : Monitor ) -> Nil {
334- let _ = ffi_demonitor ( reference , [ atom . create_from_string ( "flush" ) ] )
343+ let _ = ffi_demonitor ( reference , [ atom . create ( "flush" ) ] )
335344 Nil
336345}
337346
0 commit comments