/ tests / tests / compiler / function / flatten_test.adl
flatten_test.adl
  1  
  2  program test.alpha {
  3      struct Row {
  4          e1: u8,
  5          e2: u8,
  6          e3: u8
  7      }
  8  
  9      struct Board {
 10          r1: Row,
 11          r2: Row,
 12          r3: Row,
 13      }
 14  
 15      function win(b: Board, p: u8) -> bool {
 16          return
 17              (b.r1.e1 == p && b.r1.e2 == p && b.r1.e3 == p) || // row 1
 18              (b.r2.e1 == p && b.r2.e2 == p && b.r2.e3 == p) || // row 2
 19              (b.r3.e1 == p && b.r3.e3 == p && b.r3.e3 == p) || // row 3
 20              (b.r1.e1 == p && b.r2.e1 == p && b.r3.e1 == p) || // column 1
 21              (b.r1.e2 == p && b.r2.e3 == p && b.r3.e2 == p) || // column 2
 22              (b.r1.e3 == p && b.r2.e3 == p && b.r3.e3 == p) || // column 3
 23              (b.r1.e1 == p && b.r2.e2 == p && b.r3.e3 == p) || // diagonal
 24              (b.r1.e3 == p && b.r2.e2 == p && b.r3.e1 == p); // other diagonal
 25      }
 26  
 27      transition main(public player: u8, row: u8, col: u8, board: Board) -> (Board, u8) {
 28          let updated: Board = board;
 29          if row == 1u8 && col == 1u8 && updated.r1.e1 == 0u8 {
 30              updated = Board {
 31                  r1: Row {
 32                      e1: player,
 33                      e2: updated.r1.e2,
 34                      e3: updated.r1.e3
 35                  },
 36                  r2: updated.r2,
 37                  r3: updated.r3
 38              };
 39          } else if row == 1u8 && col == 2u8 && updated.r1.e2 == 0u8 {
 40              updated = Board {
 41                  r1: Row {
 42                      e1: updated.r1.e1,
 43                      e2: player,
 44                      e3: updated.r1.e3
 45                  },
 46                  r2: updated.r2,
 47                  r3: updated.r3
 48              };
 49          } else if row == 1u8 && col == 3u8 && updated.r1.e3 == 0u8 {
 50              updated = Board {
 51                  r1: Row {
 52                      e1: updated.r1.e1,
 53                      e2: updated.r1.e2,
 54                      e3: player
 55                  },
 56                  r2: updated.r2,
 57                  r3: updated.r3
 58              };
 59          } else if row == 2u8 && col == 1u8 && updated.r2.e1 == 0u8 {
 60              updated = Board {
 61                  r1: updated.r1,
 62                  r2: Row {
 63                      e1: player,
 64                      e2: updated.r2.e2,
 65                      e3: updated.r2.e3
 66                  },
 67                  r3: updated.r3
 68              };
 69          } else if row == 2u8 && col == 2u8 && updated.r2.e2 == 0u8 {
 70              updated = Board {
 71                  r1: updated.r1,
 72                  r2: Row {
 73                      e1: updated.r2.e1,
 74                      e2: player,
 75                      e3: updated.r2.e3
 76                  },
 77                  r3: updated.r3
 78              };
 79          } else if row == 2u8 && col == 3u8 && updated.r2.e3 == 0u8 {
 80              updated = Board {
 81                  r1: updated.r1,
 82                  r2: Row {
 83                      e1: updated.r2.e1,
 84                      e2: updated.r2.e2,
 85                      e3: player
 86                  },
 87                  r3: updated.r3
 88              };
 89          } else if row == 3u8 && col == 1u8 && updated.r3.e1 == 0u8 {
 90              updated = Board {
 91                  r1: updated.r1,
 92                  r2: updated.r2,
 93                  r3: Row {
 94                      e1: player,
 95                      e2: updated.r3.e2,
 96                      e3: updated.r3.e3
 97                  }
 98              };
 99          } else if row == 3u8 && col == 2u8 && updated.r3.e2 == 0u8 {
100              updated = Board {
101                  r1: updated.r1,
102                  r2: updated.r2,
103                  r3: Row {
104                      e1: updated.r3.e1,
105                      e2: player,
106                      e3: updated.r3.e3
107                  }
108              };
109          } else if row == 3u8 && col == 3u8 && updated.r3.e3 == 0u8 {
110              updated = Board {
111                  r1: updated.r1,
112                  r2: updated.r2,
113                  r3: Row {
114                      e1: updated.r3.e1,
115                      e2: updated.r3.e2,
116                      e3: player
117                  }
118              };
119          }
120          if win(updated, 1u8) {
121              return (updated, 1u8);
122          } else if win(updated, 2u8) {
123              return (updated, 2u8);
124          } else {
125              return (updated, 0u8);
126          }
127      }}