256 constant CONNECTION_BUFFER_SIZE

0
  cell                    +field connection.number
  cell                    +field connection.fd
  cell                    +field connection.connected
  cell                    +field connection.bufferlen
  CONNECTION_BUFFER_SIZE  +field connection.buffer
constant /CONNECTION

1024 10 * constant MAX_CONNECTIONS

variable last-connection -1 last-connection !
variable largest-index -1 largest-index !
MAX_CONNECTIONS /CONNECTION * constant CONNECTIONS_SIZE
create connections CONNECTIONS_SIZE allot
connections CONNECTIONS_SIZE erase

: (translate) ( index-u -- connection-addr )
  /CONNECTION * connections + ;
: (untranslate) ( connection-addr -- index-u )
  connections - /CONNECTION / ;
: (find-free) ( -- index-u flag )
  MAX_CONNECTIONS 0 DO
    I (translate) connection.connected @ invert IF
      I true UNLOOP EXIT
    THEN
  LOOP 0 false ;
: connections.append ( connection-addr -- flag )
  (find-free) IF
    tuck (translate) /CONNECTION move
    dup last-connection !
    dup largest-index @ > IF
      largest-index !
    ELSE
      drop
    THEN
    true
  ELSE
    2drop false
  THEN ;
: connections.count ( -- count-u )
  largest-index @ 1+ ;
: connections.at ( index-u -- connection-addr )
  (translate) ;
: connections.last ( -- connection-addr )
  last-connection @ (translate) ;
: connections.indexOf ( connection-addr -- index-u )
  (untranslate) ;