Summary
Types
@type discard_error() :: :tile_not_in_hand | :tsumogiri_mismatch
@type error() :: :already_has_draw | :missing_pon_for_kakan | discard_error()
@type t() :: %Riichi.Hand{ draw: (Riichi.Tile.t() | nil) | nil, melds: [Riichi.Hand.Meld.t()], tiles: [Riichi.Tile.t()] | nil }
Functions
@spec ankan_candidates(t()) :: [ {Riichi.Tile.t(), Riichi.Tile.t(), Riichi.Tile.t(), Riichi.Tile.t()} ]
@spec chii_candidates(t(), Riichi.Tile.t()) :: [{Riichi.Tile.t(), Riichi.Tile.t()}]
@spec daiminkan_candidates(t(), Riichi.Tile.t()) :: [ {Riichi.Tile.t(), Riichi.Tile.t(), Riichi.Tile.t()} ]
@spec discard(t(), Riichi.Tile.t(), boolean()) :: {:ok, t()} | {:error, discard_error()}
@spec draw(t(), Riichi.Tile.t()) :: {:ok, t()} | {:error, :already_has_draw}
@spec kakan_candidates(t()) :: [{Riichi.Tile.t(), Riichi.Hand.Meld.Pon.t()}]
@spec make_ankan(t(), Riichi.Hand.Meld.Ankan.t()) :: {:ok, t()} | {:error, atom()}
@spec make_chii(t(), Riichi.Hand.Meld.Chii.t()) :: {:ok, t()} | {:error, :tile_not_in_hand}
@spec make_daiminkan(t(), Riichi.Hand.Meld.Daiminkan.t()) :: {:ok, t()} | {:error, :tile_not_in_hand}
@spec make_kakan(t(), Riichi.Hand.Meld.Kakan.t()) :: {:ok, t()} | {:error, :missing_pon_for_kakan}
@spec make_pon(t(), Riichi.Hand.Meld.Pon.t() | Riichi.Hand.Meld.Pon.t()) :: {:ok, t()} | {:error, :tile_not_in_hand}
@spec new([Riichi.Tile.t()]) :: t()
@spec pon_candidates(t(), Riichi.Tile.t()) :: [{Riichi.Tile.t(), Riichi.Tile.t()}]
@spec take_tiles(t(), Riichi.Tile.t(), boolean()) :: [Riichi.Tile.t()]