Nodal-hash.pl

From Organic Design wiki
Revision as of 22:02, 29 December 2005 by Nad (talk | contribs) (Starting nodalHash object)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
  1. !/usr/bin/perl
  1. The main peerd script could load the space, then insert a peer-init sequence
  2. - INIT does servicate/daemonise, config, server... even peer-ctl
  3. - thats how the nodal core becomes the guts of peerd
  4. - ROOT contains the main "daemons": CRON, serverIterate, POP etc
  1. WE still need our own tie (not Tie:RefHash) because our structure contains SUBJECT,OBJECT,CONTENT

use Carp; use Scalar::Util qw( refaddr ); use strict;

  1. Constants used internally by tied-array

use constant SUBJECT => 0; use constant CONTENT => 1; use constant OBJECT => 2;

  1. Nodes needed for nodal operation

use constant ROOT => 0; use constant GUID => 1; use constant NAME => 2; use constant CODE => 3; use constant LANG => 4; use constant PERL => 5; use constant PEER => 6; use constant FILE => 7; use constant TEXT => 8; use constant NODE => 9; use constant INIT => 10; use constant ONCREATE => 11; use constant ONDELETE => 12; use constant ONCHANGE => 13; use constant ONREAD => 14; use constant ONSHIFT => 15; use constant ONPUSH => 16; use constant ONEXTEND => 17;

  1. Space used internally by NodalHash and its functions

our %data = ();

  1. ----------------------------------------------------------------------------------------------------------- #

package NodalHash;

sub TIEHASH { my $class = shift; my $this = []; bless $this, $class; $this->STORE(shift, shift) while @_; return $this; }

sub FETCH { my ( $this, $key ) = @_; if ( ref $key ) { defined $$this[0]{$key} ? $$this[0]{$key}[1] : undef } else { $$this[1]{$key} } }

sub STORE { my ( $this, $key, $val ) = @_; if ( ref $val eq 'HASH' and not tied %$val ) { my @elems = %$val; tie %$val, ref $this, @elems; } ref $key ? $$this[0]{$key} = [ $key, $val ] : $$this[1]{$key} = $val; $val; }

sub DELETE { my( $this, $key ) = @_; ref $key ? ( delete( $$this[0]{$key} ) || [])->[1] : delete( $this->[1]{$key} ); }

sub EXISTS { my ( $this, $key ) = @_; ref $key ? exists( $$this[0]{$key} ) : exists( $$this[1]{$key} ); }

sub FIRSTKEY { my $this = shift; keys %{ $$this[0] }; # reset iterator keys %{ $$this[1] }; # reset iterator $$this[2] = 0; # flag for iteration, see NEXTKEY $this->NEXTKEY; }

sub NEXTKEY { my $this = shift; my ( $key, $val ); if ( !$$this[2] ) { return $$val[0] if ( $key, $val ) = each %{ $$this[0] } } else { $$this[2] = 1 } return each %{ $$this[1] }; }

sub CLEAR { my $this = shift; $this->[2] = 0; %{ $this->[0] } = (); %{ $this->[1] } = (); }

sub shift { # Reduce from %root }

sub push { }

sub save { }

sub load { }

  1. ----------------------------------------------------------------------------------------------------------- #

package main;

my $y = tie my %root, 'NodalHash';

  1. my $y = \%root;

my $x = \ "hello";

$root{$x} = 'world';

$y->push;

  1. print "$$_\n" for keys %root;