@@ -4,6 +4,11 @@ import (
44 "time"
55)
66
7+ // ActorHandle A target could send messages
8+ type ActorHandle interface {
9+ Send (message interface {})
10+ }
11+
712// ActorDef Actor model inspired by Erlang/Akka
813type ActorDef struct {
914 id time.Time
@@ -102,8 +107,83 @@ func (actorSelf *ActorDef) run() {
102107// Actor Actor utils instance
103108var Actor ActorDef
104109
110+ // AskDef Ask inspired by Erlang/Akka
111+ type AskDef struct {
112+ id time.Time
113+ ch * chan interface {}
114+ timeout * time.Duration
115+
116+ Message interface {}
117+ }
118+
119+ // New New Ask instance
120+ func (askSelf * AskDef ) New (message interface {}, timeout * time.Duration ) * AskDef {
121+ return AskNewGenerics (message , timeout )
122+ }
123+
124+ // NewByOptions New Ask by its options
125+ func (askSelf * AskDef ) NewByOptions (message interface {}, ioCh * chan interface {}, timeout * time.Duration ) * AskDef {
126+ return AskNewByOptionsGenerics (message , ioCh , timeout )
127+ }
128+
129+ // AskNewGenerics New Ask instance
130+ func AskNewGenerics (message interface {}, timeout * time.Duration ) * AskDef {
131+ ch := make (chan interface {})
132+ return AskNewByOptionsGenerics (message , & ch , timeout )
133+ }
134+
135+ // AskNewByOptionsGenerics New Ask by its options
136+ func AskNewByOptionsGenerics (message interface {}, ioCh * chan interface {}, timeout * time.Duration ) * AskDef {
137+ newOne := AskDef {
138+ id : time .Now (),
139+ ch : ioCh ,
140+ timeout : timeout ,
141+
142+ Message : message ,
143+ }
144+
145+ return & newOne
146+ }
147+
148+ // AskOnce Sender Ask
149+ func (askSelf * AskDef ) AskOnce (target ActorHandle ) interface {} {
150+ ch , timer := askSelf .AskChannel (target )
151+ result , success := <- * ch
152+ if success && timer != nil {
153+ timer .Stop ()
154+ close (* ch )
155+ }
156+
157+ return result
158+ }
159+
160+ // AskChannel Sender Ask
161+ func (askSelf * AskDef ) AskChannel (target ActorHandle ) (* chan interface {}, * time.Timer ) {
162+ var timer * time.Timer
163+ target .Send (askSelf )
164+ if askSelf .timeout != nil {
165+ timer = time .NewTimer (time .Second )
166+ go func () {
167+ <- timer .C
168+ close (* askSelf .ch )
169+ }()
170+ }
171+
172+ return askSelf .ch , timer
173+ }
174+
175+ // Reply Receiver Reply
176+ func (askSelf * AskDef ) Reply (response interface {}) {
177+ * askSelf .ch <- response
178+ }
179+
180+ // Ask Ask utils instance
181+ var Ask AskDef
182+
105183func init () {
106- Actor = * Actor .New (func (_ * ActorDef , _ interface {}) {})
107- Actor .Close ()
184+ //Ask = *Ask.New(0, nil)
185+ //Actor = *Actor.New(func(_ *ActorDef, _ interface{}) {})
186+ //Actor.Close()
187+ Actor .isClosed = true
108188 defaultActor = & Actor
109189}
0 commit comments