const drill = useDrill({ generate: (random) => generateNoteQuestion(settings, random), length: 10, seed });
drill.question ? <DrillCard round={drill.round} index={drill.index} total={drill.total} loadEngine={loadEngine} onAnswer={drill.answer} onNext={drill.next} />
: <DrillScoreCard summary={drill.summary} onAgain={() => drill.restart()} onAnother={() => setSeed(newSeed())} />
A drill in a component: the round being asked, answering it, moving on, finishing early with what was answered, and starting over. The drill is drawn from
seedwhen it starts and wheneverseedorlengthchange — in the same render, so the old drill's question is never shown — so a new seed is a new drill; thegeneratefunction is read at that moment, so it need not be memoised.