package main import ( "time" ) func Next(ts time.Time, history []int) time.Time { n, ef, i := 0, 2.5, 1 for j := range history { n, ef, i = sm2Next(history[j], n, ef, i) } return ts.Add(time.Duration(i) * time.Hour * 24) } // After all scheduled reviews are complete, SuperMemo asks the user to re-review any cards they marked with a grade less than 4 repeatedly until they give a grade ≥ 4. func sm2Next(thisGrade int, consecutivePassesBeforeThis int, efBefore float64, lastInterval int) (int, float64, int) { q := thisGrade n := consecutivePassesBeforeThis ef := efBefore i := lastInterval if q >= 3 { switch n { case 0: i = 1 case 1: i = 6 default: i = int(float64(i) * ef) } n += 1 } else { n = 0 i = 1 } ef = ef + (.1 - (5.0-float64(q))*(.08+(5.0-float64(q))*.02)) if ef < 1.3 { ef = 1.3 } return n, ef, i }