! See http://factorcode.org/license.txt for BSD license.
!
! Remote Channels
-USING: kernel init namespaces assocs arrays random
-sequences channels match concurrency.messaging
-concurrency.distributed threads accessors ;
+USING: accessors assocs channels concurrency.distributed
+concurrency.messaging init kernel match namespaces random
+threads ;
IN: channels.remote
<PRIVATE
: unpublish ( id -- )
remote-channels delete-at ;
-
+
<PRIVATE
MATCH-VARS: ?from ?tag ?id ?value ;
[
{
{ T{ to-message f ?id ?value }
- [ ?value ?id get-channel dup [ to f ] [ 2drop no-channel ] if ] }
+ [ ?value ?id get-channel [ to f ] [ drop no-channel ] if* ] }
{ T{ from-message f ?id }
[ ?id get-channel [ from ] [ no-channel ] if* ] }
} match-cond
: start-channel-node ( -- )
"remote-channels" get-remote-thread [
[ channel-thread t ] "Remote channels" spawn-server
- "remote-channels" register-remote-thread
+ "remote-channels" register-remote-thread
] unless ;
PRIVATE>
TUPLE: remote-channel node id ;
-C: <remote-channel> remote-channel
+C: <remote-channel> remote-channel
<PRIVATE
: send-message ( message remote-channel -- value )
- node>> "remote-channels" <remote-thread>
+ node>> "remote-channels" <remote-thread>
send-synchronous dup no-channel = [ no-channel throw ] when* ;
-
+
PRIVATE>
-M: remote-channel to ( value remote-channel -- )
+M: remote-channel to
[ id>> swap to-message boa ] keep send-message drop ;
-M: remote-channel from ( remote-channel -- value )
+M: remote-channel from
[ id>> from-message boa ] keep send-message ;
[