summaryrefslogtreecommitdiffstats
path: root/examples/board.rb
blob: b76679f496572688b3a8bd64eca0e08fdfda3193 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#! /usr/bin/env ruby
# -*- coding: UTF-8 -*-
#
# from the project top directory :
#
# run this script which builds the example system and spin it untill it's empty:
#   $ ruby -Ilib examples/links.rb
#
require 'edoors'
#
class FileReader < Edoors::Door
    #
    def initialize n, p, path
        super n, p
        @file = File.open(path,'r')
    end
    #
    def start!
        # stimulate myself on system boot up
        send_p require_p(Edoors::Particle), Edoors::ACT_GET
    end
    #
    def receive_p p
        if p.action==Edoors::ACT_GET
            # stop everything if EOF reached
            if @file.eof?
                p.reset!
                send_p p, Edoors::ACT_PASS_THROUGH, 'stats'
            else
                p.set_data 'person', JSON.load(@file.readline)
                # will follow the non conditional link.
                # see Room#_send and Room#_try_links
                send_p p
                # stimulate myself
                start!
            end
        end
    end
    #
end
#
class Filter < Edoors::Door
    #
    def receive_p p
        if p.action!=Edoors::ACT_ERROR
            # apply the filter
            h = {
                :old => (p['person']['age']>=18),
                :female => (p['person']['sex']=='f')
            }
            # puts "input : "+h.inspect
            # store the result into one single attribute
            p['filter_value']= h
            # will follow the conditional link.
            # see Room#_send and Room#_try_links
            send_p p
        end
    end
    #
end
#
class Stats < Edoors::Board
    #
    def receive_p p
        return if p.action==Edoors::ACT_ERROR
        if p.action==Edoors::ACT_PASS_THROUGH
            # use this signal to flush all stored data
            flush!
        else
            # restore the Particle into myself
            # send_p p, self.path
            keep! p
        end
    end
    #
end
#
class OutputDoor < Edoors::Door
    #
    #
    def receive_p p
        return if p.action==Edoors::ACT_ERROR
        f = p['filter_value']
        puts "Team #{f[:old] ? 'mature' : 'tean'} #{f[:female] ? 'women' : 'men'} #{} (#{p.merged_length+1})"
        d = p.get_data('person')
        puts " #{d['name']} is #{d['age']} years old"
        p.each_merged do |o|
            d = o.get_data('person')
            puts " #{d['name']} is #{d['age']} years old"
        end
        puts
    end
    #
end
#
if $0 == __FILE__
    # basic setup, see hello_world.rb
    dom0 = Edoors::Spin.new 'dom0'
    #
    FileReader.new 'input', dom0, './examples/data.json'
    # the filter to be applied to each particle
    Filter.new 'filter', dom0
    # the statistics board
    Stats.new 'stats', dom0
    # different outptu doors
    OutputDoor.new 'output', dom0
    # default link directing everything from input into age_filter
    dom0.add_link Edoors::Link.new('input', ['filter','stats?follow','output'], 'filter_value')
    #
    # schedule the spinning particles untill the system cools down
    dom0.spin!
    #
end
#
# EOF