keyboard function

Iterable<String> keyboard({
  1. Iterable<Letter> playedLetters = const [],
})

Generates the keyboard. Generally use this with .join('\n') to create a human-readable board:

final actual = keyboard().join('\n');
const matcher = '''
  ┌─────────────────────┐
  │ Q W E R T Y U I O P │
  │  A S D F G H J K L  │
  │    Z X C V B N M    │
  └─────────────────────┘''';
assert(actual == matcher);

Implementation

Iterable<String> keyboard({
  Iterable<Letter> playedLetters = const [],
}) sync* {
  final hits =
      playedLetters.where((letter) => letter.status == LetterStatus.hit);
  final misses =
      playedLetters.where((letter) => letter.status == LetterStatus.miss);
  final closes =
      playedLetters.where((letter) => letter.status == LetterStatus.close);

  const qwer = ['Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P'];
  const asdf = ['A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L'];
  const zxcv = ['Z', 'X', 'C', 'V', 'B', 'N', 'M'];

  final _qwer = keyboardRow(
    qwer,
    close,
    hit,
    miss,
    hits: hits,
    misses: misses,
    closes: closes,
  ).join(' ');
  final _asdf = keyboardRow(
    asdf,
    close,
    hit,
    miss,
    hits: hits,
    misses: misses,
    closes: closes,
  ).join(' ');
  final _zxcv = keyboardRow(
    zxcv,
    close,
    hit,
    miss,
    hits: hits,
    misses: misses,
    closes: closes,
  ).join(' ');

  yield '┌─────────────────────┐';
  yield '│ $_qwer │';
  yield '│  $_asdf  │';
  yield '│    $_zxcv    │';
  yield '└─────────────────────┘';
}