summary refs log tree commit diff
path: root/src/test/bench/99bob-pattern.rs
blob: a2a1c00b75d6664a01b3ef77fe0f4b7740c0025a (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


/* -*- mode::rust;indent-tabs-mode::nil -*-
 * Implementation of 99 Bottles of Beer
 * http://99-bottles-of-beer.net/
 */
use std;
import int;
import str;

enum bottle { none, dual, single, multiple(int), }

fn show(b: bottle) {
    alt b {
      none {
        #debug("No more bottles of beer on the wall, \
                no more bottles of beer,");
        #debug("Go to the store and buy some more, \
                99 bottles of beer on the wall.");
      }
      single {
        #debug("1 bottle of beer on the wall, 1 bottle of beer,");
        #debug("Take one down and pass it around, \
                no more bottles of beer on the wall.");
      }
      dual {
        #debug("2 bottles of beer on the wall, 2 bottles of beer,");
        #debug("Take one down and pass it around, \
                1 bottle of beer on the wall.");
      }
      multiple(n) {
        #debug("%d bottles of beer on the wall, %d bottles of beer,", n, n);
        #debug("Take one down and pass it around, \
                %d bottles of beer on the wall.", n-1);
      }
    }
}

fn next(b: bottle) -> bottle {
    alt b {
      none { ret none; }
      single { ret none; }
      dual { ret single; }
      multiple(3) { ret dual; }
      multiple(n) { ret multiple(n - 1); }
    }
}


// Won't need this when tags can be compared with ==
fn more(b: bottle) -> bool { alt b { none { ret false; } _ { ret true; } } }

fn main() {
    let mut b: bottle = multiple(99);
    let mut running: bool = true;
    while running { show(b); #debug(""); running = more(b); b = next(b); }
}