# Canasta

This is a library for the card game _canasta_, providing a simple interface when
creating a back-end and/or front-end for the game.

## Installation

Simply add this to your `mix.exs` file:

{:canasta, "~> 0.1.0"},

## Testing

To make sure everything works as it should, simply run `mix test`. This is also
done on every push to the repository, so you shouldn't have to worry about this.

## Usage

To provide an interface as simple as possible for the user, I've merged all
setup required into one function `Canasta.Game.create/0`. This will return a new
`Canasta.Game` structure, which is what you will interact with throughout the
use of the lib.

game = Canasta.Game.create

The structure of the game looks like this, and this is what you will retrieve
when structuring your front/back-end:

  pile: [
    %Canasta.Card{rank: :jack, suit: :hearts},
    %Canasta.Card{rank: :jack, suit: :diamonds},
    %Canasta.Card{rank: 5, suit: :spades},
    %Canasta.Card{rank: 6, suit: :clubs},
  player_one: %Canasta.Player{
    hand: [
    points: 0,
    red_threes: [%Canasta.Card{...}],
    table: [
      %Meld{cards: [%Canasta.Card{...}]}
  player_turn: :player_one,
  player_two: %Canasta.Player{
  pulled: true,
  table: [%Canasta.Card{...}]

### Available actions

To perform an action you will use the `` function. This will
either return a tuple, where the first element is an error, or just a
`Canasta.Game` structure -- if successful.

#### Draw

_Input_: `%{action: :draw}`.

This will give a card to the player whose turn it is.

#### Play a card

_Input_: `%{action: :play_card, card: %Canasta.Card{...}}`

This will play the card from the hand of the current player.

#### Meld

_Input_: `%{action: :meld, melds: [%Canasta.Meld{...}]}`

This will create a meld (or several if specified) with the cards from the
players hand. If the player has not drafted a card, it will try to take the top
card on the table and create a meld with that. If the player has drafted a card,
a normal meld (or melds) will be created.