README.md

# xo

A [Tic-tac-toe](https://en.wikipedia.org/wiki/Tic-tac-toe) library for Gleam.

## An example

```gleam
import gleam/io
import gleam/string
import xo.{X}

pub fn main() {
  let game0 = xo.start(X)
  let assert Ok(game1) = xo.play(game0, #(1, 1)) // X
  let assert Ok(game2) = xo.play(game1, #(0, 0)) // O

  let assert Error(xo.OutOfBounds(#(3, 3))) = xo.play(game2, #(3, 3))
  let assert Error(xo.Occupied(#(1, 1))) = xo.play(game2, #(1, 1))

  let assert Ok(game3) = xo.play(game2, #(2, 2)) // X
  let assert Ok(game4) = xo.play(game3, #(2, 1)) // O

  io.println(xo.to_string(game4))
  // => o...x..ox

  // Where should I play?
  let moves = xo.get_smart_moves(game4)

  io.println(string.inspect(moves))
  // => [#(0, 2), #(1, 2)]

  let assert Ok(game5) = xo.play(game4, #(1, 2)) // X

  // It doesn't matter where you play now,
  // you're going to lose
  let assert Ok(game6) = xo.play(game5, #(0, 2)) // O

  // Make the winning play
  let assert Ok(game7) = xo.play(game6, #(1, 0)) // X

  io.println(string.inspect(xo.to_state(game7)))
  // => State(X, X, Win(X, [#(#(1, 0), #(1, 1), #(1, 2))]))
  //          ^  ^  ^
  //          |  |  |__ outcome
  //          |  |_____ turn
  //          |________ first
}
```

## The public API at a glance

```txt
Player, next_turn

Game, start

Position, PlayError, play

Rules, default_rules, play_again

State, Outcome, Line, to_state

Tile, map

to_string

get_random_move, get_smart_moves
```