Я пытаюсь закодировать некоторые агенты стиля Clojure в F #, используя MailboxProcessors. Вот что у меня есть:
namespace GameEngine
type Agent<'T>(inital:'T) =
let mutable state:'T = inital
let queue = new MailboxProcessor<'T -> 'T>( fun inbox ->
let rec loop count =
async {
let! msg = inbox.Receive()
state <- msg(state)
return! loop(count + 1)
}
loop 0)
do
queue.Start()
member self.Send(action:'T -> 'T) =
queue.Post(action)
member self.Deref() =
state
Итак, основная идея заключается в том, что у нас есть изменяемое состояние, которое можно обновить, вызвав .Send (). У меня вопрос, будут ли мои сообщения когда-либо не в порядке? Если сообщение A отправляется до B, будет ли вышеуказанная асинхронная функция всегда обрабатывать A до B?
Похоже, что такой класс должен быть уже в F #? Я изобретаю колесо?