aboutsummaryrefslogtreecommitdiff
path: root/src/main.rs
blob: b4adbd3c7a1836f29b05448319ae0c6c961c7e43 (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
use std::time::Duration;

use minifb::{Key, Window, WindowOptions};

mod actor;
mod basic_actors;
mod number;
mod world;

const WIDTH: usize = 1600;
const HEIGHT: usize = 900;

fn main() {
    let mut buffer: Vec<u32> = vec![0; WIDTH * HEIGHT];

    let mut window = Window::new(
        "the Hope system",
        WIDTH,
        HEIGHT,
        WindowOptions::default()
    ).unwrap();

    window.limit_update_rate(Some(Duration::from_millis(16)));

    // hard code this for now
    let mut world = world::World::default();

    let nonnegative_int = actor::Type::NumberInRange {
        min: Some(number::Number::from(0)),
        max: None,
    };
    let screen_position_type = actor::Type::Record {
        name: "Screen Position".to_string(),
        fields: vec![
            actor::Slot { name: "X".to_string(), r#type: nonnegative_int.clone() },
            actor::Slot { name: "Y".to_string(), r#type: nonnegative_int.clone() },
        ],
    };
    let system_inputs = vec![actor::Slot { name: "mouse_position".to_string(), r#type: screen_position_type.clone() }];

    let u24 = actor::Type::NumberInRange {
        min: Some(number::Number::from(0)),
        max: Some(number::Number::from(1 << 24 - 1)),
    };
    let system_outputs = vec![actor::Slot { name: "screen_buffer".to_string(), r#type: actor::Type::List { contents: Box::new(u24.clone()) }}];

    let mut system = actor::ProgrammableActor {
        inputs: system_inputs,
        outputs: system_outputs,
        ..Default::default()
    };

    let deconstruct_record = basic_actors::DeconstructRecord {
        record_type: screen_position_type,
    };
    world.upsert_actor_type("Deconstruct Screen Position".to_string(), Box::new(deconstruct_record));
    let deconstruct_record = system.add_child("Deconstruct Screen Position".to_string());
    system.add_cable(
        actor::ProducerSlotID::Input("mouse_position".to_string()),
        actor::ConsumerSlotID::ChildInput(deconstruct_record, "Record".to_string())
    );

    world.upsert_actor_type("Add".to_string(), Box::new(basic_actors::Add));
    let add = system.add_child("Add".to_string());
    system.add_cable(
        actor::ProducerSlotID::ChildOutput(deconstruct_record, "X".to_string()),
        actor::ConsumerSlotID::ChildInput(add, "N1".to_string())
    );
    system.add_cable(
        actor::ProducerSlotID::ChildOutput(deconstruct_record, "Y".to_string()),
        actor::ConsumerSlotID::ChildInput(add, "N2".to_string())
    );

    let buffer_size_constant = basic_actors::Constant {
        r#type: nonnegative_int.clone(),
        value: actor::Value::Number(number::Number::from(WIDTH * HEIGHT)),
    };
    world.upsert_actor_type("Buffer Size Constant".to_string(), Box::new(buffer_size_constant));
    let buffer_size_constant = system.add_child("Buffer Size Constant".to_string());

    let repeat_u24 = basic_actors::RepeatValue {
        r#type: u24,
    };
    world.upsert_actor_type("Repeat u24".to_string(), Box::new(repeat_u24));
    let repeat_u24 = system.add_child("Repeat u24".to_string());
    system.add_cable(
        actor::ProducerSlotID::ChildOutput(add, "Result".to_string()),
        actor::ConsumerSlotID::ChildInput(repeat_u24, "Value".to_string())
    );
    system.add_cable(
        actor::ProducerSlotID::ChildOutput(buffer_size_constant, "Value".to_string()),
        actor::ConsumerSlotID::ChildInput(repeat_u24, "Count".to_string())
    );
    system.add_cable(
        actor::ProducerSlotID::ChildOutput(repeat_u24, "List".to_string()),
        actor::ConsumerSlotID::Output("screen_buffer".to_string())
    );

    world.upsert_actor_type("System".to_string(), Box::new(system));

    while window.is_open() && !window.is_key_down(Key::Escape) {
        window
            .update_with_buffer(&buffer, WIDTH, HEIGHT)
            .unwrap();
    }
}