/
CDC-1.2b/
CDC-1.2b/src/
parent $utilities
object $heart

var $root dbref 'heart
var $root child_index 0
var $root fertile 0
var $root manager $heart
var $root owned [$heart]
var $root owners [$heart]
var $root writable []
var $root readable ['parameters, 'methods, 'code]
var $root inited 1
var $heart heart_failures []
var $heart hearts []

method pulse
    var robot, h;
    
    // send every robot that has a heart a pulse, if needed.
    for robot in [1 .. listlen(hearts)] {
        if ((((hearts[robot])[2]) + ((hearts[robot])[3])) < time()) {
            .debug("pulsing", hearts[robot]);
            hearts = replace(hearts, robot, [(hearts[robot])[1], time(), (hearts[robot])[3]]);
            (| ((hearts[robot])[1]).pulse() |);
        }
    }
.

method add_heartbeat
    arg [delay];
    var p;
    
    delay = [@delay, 60][1];
    for p in [1 .. listlen(hearts)] {
        if (((hearts[p])[1]) == sender()) {
            hearts = replace(hearts, p, [sender(), 0, delay]);
            return;
        }
    }
    hearts = [@hearts, [sender(), 0, delay]];
.

method del_heartbeat
    var h, pos;
    
    h = [];
    for pos in [1 .. listlen(hearts)] {
        if (((hearts[pos])[1]) == sender()) {
            if (pos > 1)
                h = [@s, sublist(hearts, 1, pos - 1)];
            if (pos < listlen(hearts))
                h = [@h, sublist(hearts, pos + 1)];
            hearts = h;
            return;
        }
    }
    throw(~objnf, ("Sender (" + tostr(sender())) + ") does not have a heartbeat.");
.