moved to <http://code.mathr.co.uk/kjhf>
[maximus:kjhf.git] / prototype / hyperspace.h
1 /*****************************************************************************
2 **
3 **  hyperfuck -- boolfuck in the hyperbolic plane
4 **  Copyright (C) 2010 Claude Heiland-Allen <claude@mathr.co.uk>
5 **
6 */
7
8 #ifndef HYPERSPACE_H
9 #define HYPERSPACE_H 1
10
11 #include "bitstream.h"
12
13 /***    struct cell    *******************************************************
14 **
15 **  pentagonal hyperbolic cell data structure definition
16 **
17 **  TOP                     LEFT                    RIGHT
18 **    c->up == 0              c->up != 0              c->up != 0
19 **                            c->up->downLeft == c    c->up->downRight == c
20 **                              +-------+             +-------+
21 **        0                     |   ^   |             |   ^   |
22 **      +---+                   +---+---+             +---+---+
23 **    0 |###| 0               ?<|###|>?                 ?<|###|>?
24 **      +-+-+                   +-+-+                     +-+-+
25 **       / \                     / \                       / \
26 **      ?   ?                   ?   ?                     ?   ?
27 **
28 **  INVARIANT
29 **    exactly one cell is TOP
30 **
31 */
32
33 struct cell {
34   struct cell *up, *left, *right, *downLeft, *downRight;
35   void *data;
36 };
37
38 struct cell *cell(void);
39
40 /***    struct space    ******************************************************
41 **
42 **  a region of hyperbolic space defined by its top cell below a bitstream
43 **
44 **  INVARIANT
45 **    s->above is finite, OR,
46 **    every suffix of s->above contains a 0 and a 1
47 **
48 **  RATIONALE
49 **    an infinite stream of 0 will cause problems when moving left
50 **    an infinite stream of 1 will cause problems when moving right
51 **
52 */
53
54 struct space {
55   struct ibitstream *above;
56   struct cell *top;
57 };
58
59 struct space *space(struct ibitstream *);
60
61 /***    struct cursor    *****************************************************
62 **
63 **  a point in a region of hyperbolic space
64 **  moving a cursor expands the region as required
65 **
66 */
67
68 struct cursor {
69   struct space *space;
70   struct cell *cell;
71 };
72
73 struct cursor *cursor(struct space*);
74
75 struct cursor *up       (struct cursor *, int);
76 struct cursor *left     (struct cursor *);
77 struct cursor *right    (struct cursor *);
78 struct cursor *downLeft (struct cursor *);
79 struct cursor *downRight(struct cursor *);
80
81 #endif
82