Fix bug when there are no new items to introduce
authorCarl Worth <cworth@cworth.org>
Fri, 27 Mar 2009 22:17:18 +0000 (15:17 -0700)
committerCarl Worth <cworth@cworth.org>
Sat, 28 Mar 2009 17:57:42 +0000 (10:57 -0700)
Previously, mnemon would keep challenging infinitely (waiting for 10
new items to be introduced). Instead, we now decrement the to_introduce
counter every time an item is selected from the smallest-number bin.

mnemon.c

index 5ce736433eed2cff4c931dde86a39c490f8f15f0..ac7c7652d5fd07c6c0dc8c32669eeede5a52947f 100644 (file)
--- a/mnemon.c
+++ b/mnemon.c
@@ -865,9 +865,20 @@ mnemon_select_item (mnemon_t        *mnemon,
     category_t *category;
 
     bin_index = rand_within_exponential (mnemon->num_bins);
-
     bin = &mnemon->bins[bin_index];
 
+    /* The most intuitive understanding of the to_introduce counter is
+     * that it's tracking never-before-learned items as they are
+     * pulled from the bin with score 0. But that bin can become
+     * empty. So the refined rule is that we decrement to_introduce
+     * whenever we pull from the lowest-indexed bin with a
+     * non-negative score. */
+    if (mnemon->to_introduce && bin->score >=0 &&
+       (bin_index == 0 || mnemon->bins[bin_index-1].score < 0))
+    {
+       mnemon->to_introduce--;
+    }
+
     item_index = rand_within (bin->num_items);
 
     item = bin->items[item_index];
@@ -1148,9 +1159,6 @@ mnemon_do_challenges (mnemon_t *mnemon)
        mnemon_select_item (mnemon, &bin, &item_index, &category);
        item = bin->items[item_index];
 
-       if (bin->score == 0)
-           mnemon->to_introduce--;
-
        while (1) {
            if (category->time_limit > 0.0) {
                response = readline ("The next one is timed. Press enter when ready:");