about summary refs log tree commit diff
path: root/src/test/bench/99bob-pattern.rs
blob: 4feeda28b1b69b0675b1827f47b432cef837267b (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
/* -*- mode::rust;indent-tabs-mode::nil -*-
 * Implementation of 99 Bottles of Beer
 * http://99-bottles-of-beer.net/
 */
use std;
import int;
import str;

tag bottle { none; dual; single; multiple(int); }

fn show(b: bottle) {
    alt b {
      none. {
        log "No more bottles of beer on the wall, " +
                "no more bottles of beer,";
        log "Go to the store and buy some more, " +
                "99 bottles of beer on the wall.";
      }
      single. {
        log "1 bottle of beer on the wall, 1 bottle of beer,";
        log "Take one down and pass it around, " +
                "no more bottles of beer on the wall.";
      }
      dual. {
        log "2 bottles of beer on the wall, 2 bottles of beer,";
        log "Take one down and pass it around, " +
                "1 bottle of beer on the wall.";
      }
      multiple(n) {
        let nb: str = int::to_str(n, 10u);
        let mb: str = int::to_str(n - 1, 10u);
        log nb + " bottles of beer on the wall, " + nb + " bottles of beer,";
        log "Take one down and pass it around, " + mb +
                " bottles of beer on the wall.";
      }
    }
}

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 b: bottle = multiple(99);
    let running: bool = true;
    while running { show(b); log ""; running = more(b); b = next(b); }
}