ts-fsrs 4.5.2 → 4.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +17 -1
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/dist/index.umd.js +1 -1
- package/dist/index.umd.js.map +1 -1
- package/package.json +6 -9
package/LICENSE
CHANGED
package/dist/index.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var o=(r=>(r[r.New=0]="New",r[r.Learning=1]="Learning",r[r.Review=2]="Review",r[r.Relearning=3]="Relearning",r))(o||{}),l=(r=>(r[r.Manual=0]="Manual",r[r.Again=1]="Again",r[r.Hard=2]="Hard",r[r.Good=3]="Good",r[r.Easy=4]="Easy",r))(l||{});class h{static card(t){return{...t,state:h.state(t.state),due:h.time(t.due),last_review:t.last_review?h.time(t.last_review):void 0}}static rating(t){if(typeof t=="string"){const e=t.charAt(0).toUpperCase(),i=t.slice(1).toLowerCase(),a=l[`${e}${i}`];if(a===void 0)throw new Error(`Invalid rating:[${t}]`);return a}else if(typeof t=="number")return t;throw new Error(`Invalid rating:[${t}]`)}static state(t){if(typeof t=="string"){const e=t.charAt(0).toUpperCase(),i=t.slice(1).toLowerCase(),a=o[`${e}${i}`];if(a===void 0)throw new Error(`Invalid state:[${t}]`);return a}else if(typeof t=="number")return t;throw new Error(`Invalid state:[${t}]`)}static time(t){if(typeof t=="object"&&t instanceof Date)return t;if(typeof t=="string"){const e=Date.parse(t);if(isNaN(e))throw new Error(`Invalid date:[${t}]`);return new Date(e)}else if(typeof t=="number")return new Date(t);throw new Error(`Invalid date:[${t}]`)}static review_log(t){return{...t,due:h.time(t.due),rating:h.rating(t.rating),state:h.state(t.state),review:h.time(t.review)}}}const A=.9,$=36500,L=[.40255,1.18385,3.173,15.69105,7.1949,.5345,1.4604,.0046,1.54575,.1192,1.01925,1.9395,.11,.29605,2.2698,.2315,2.9898,.51655,.6621],G=!1,C=!0,j="v4.5.2 using FSRS-5.0",M=r=>{let t=L;return r?.w&&(r.w.length===19?t=r?.w:r.w.length===17&&(t=r?.w.concat([0,0]),t[4]=+(t[5]*2+t[4]).toFixed(8),t[5]=+(Math.log(t[5]*3+1)/3).toFixed(8),t[6]=+(t[6]+.5).toFixed(8),console.debug("[FSRS V5]auto fill w to 19 length"))),{request_retention:r?.request_retention||A,maximum_interval:r?.maximum_interval||$,w:t,enable_fuzz:r?.enable_fuzz??G,enable_short_term:r?.enable_short_term??C}};function w(r,t){const e={due:r?h.time(r):new Date,stability:0,difficulty:0,elapsed_days:0,scheduled_days:0,reps:0,lapses:0,state:o.New,last_review:void 0};return t&&typeof t=="function"?t(e):e}Date.prototype.scheduler=function(r,t){return k(this,r,t)},Date.prototype.diff=function(r,t){return z(this,r,t)},Date.prototype.format=function(){return I(this)},Date.prototype.dueFormat=function(r,t,e){return N(this,r,t,e)};function k(r,t,e){return new Date(e?_(r).getTime()+t*24*60*60*1e3:_(r).getTime()+t*60*1e3)}function z(r,t,e){if(!r||!t)throw new Error("Invalid date");const i=_(r).getTime()-_(t).getTime();let a=0;switch(e){case"days":a=Math.floor(i/(24*60*60*1e3));break;case"minutes":a=Math.floor(i/(60*1e3));break}return a}function I(r){const t=_(r),e=t.getFullYear(),i=t.getMonth()+1,a=t.getDate(),s=t.getHours(),n=t.getMinutes(),d=t.getSeconds();return`${e}-${m(i)}-${m(a)} ${m(s)}:${m(n)}:${m(d)}`}function m(r){return r<10?`0${r}`:`${r}`}const S=[60,60,24,31,12],R=["second","min","hour","day","month","year"];function N(r,t,e,i=R){r=_(r),t=_(t),i.length!==R.length&&(i=R);let a=r.getTime()-t.getTime(),s;for(a/=1e3,s=0;s<S.length&&!(a<S[s]);s++)a/=S[s];return`${Math.floor(a)}${e?i[s]:""}`}function _(r){return h.time(r)}function W(r){return h.state(r)}function B(r){return h.rating(r)}const T=[l.Again,l.Hard,l.Good,l.Easy],J=[{start:2.5,end:7,factor:.15},{start:7,end:20,factor:.1},{start:20,end:1/0,factor:.05}];function U(r,t,e){let i=1;for(const n of J)i+=n.factor*Math.max(Math.min(r,n.end)-n.start,0);r=Math.min(r,e);let a=Math.max(2,Math.round(r-i));const s=Math.min(Math.round(r+i),e);return r>t&&(a=Math.max(a,t+1)),a=Math.min(a,s),{min_ivl:a,max_ivl:s}}function p(r,t,e){return Math.min(Math.max(r,t),e)}function q(r,t){const e=Date.UTC(r.getUTCFullYear(),r.getUTCMonth(),r.getUTCDate()),i=Date.UTC(t.getUTCFullYear(),t.getUTCMonth(),t.getUTCDate());return Math.floor((i-e)/864e5)}class K{c;s0;s1;s2;constructor(t){const e=Q();this.c=1,this.s0=e(" "),this.s1=e(" "),this.s2=e(" "),t==null&&(t=+new Date),this.s0-=e(t),this.s0<0&&(this.s0+=1),this.s1-=e(t),this.s1<0&&(this.s1+=1),this.s2-=e(t),this.s2<0&&(this.s2+=1)}next(){const t=2091639*this.s0+this.c*23283064365386963e-26;return this.s0=this.s1,this.s1=this.s2,this.s2=t-(this.c=t|0),this.s2}set state(t){this.c=t.c,this.s0=t.s0,this.s1=t.s1,this.s2=t.s2}get state(){return{c:this.c,s0:this.s0,s1:this.s1,s2:this.s2}}}function Q(){let r=4022871197;return function(t){t=String(t);for(let e=0;e<t.length;e++){r+=t.charCodeAt(e);let i=.02519603282416938*r;r=i>>>0,i-=r,i*=r,r=i>>>0,i-=r,r+=i*4294967296}return(r>>>0)*23283064365386963e-26}}function X(r){const t=new K(r),e=()=>t.next();return e.int32=()=>t.next()*4294967296|0,e.double=()=>e()+(e()*2097152|0)*11102230246251565e-32,e.state=()=>t.state,e.importState=i=>(t.state=i,e),e}const E=-.5,D=19/81;class Y{param;intervalModifier;_seed;constructor(t){this.param=new Proxy(M(t),this.params_handler_proxy()),this.intervalModifier=this.calculate_interval_modifier(this.param.request_retention)}get interval_modifier(){return this.intervalModifier}set seed(t){this._seed=t}calculate_interval_modifier(t){if(t<=0||t>1)throw new Error("Requested retention rate should be in the range (0,1]");return+((Math.pow(t,1/E)-1)/D).toFixed(8)}get parameters(){return this.param}set parameters(t){this.update_parameters(t)}params_handler_proxy(){const t=this;return{set:function(e,i,a){return i==="request_retention"&&Number.isFinite(a)&&(t.intervalModifier=t.calculate_interval_modifier(Number(a))),Reflect.set(e,i,a),!0}}}update_parameters(t){const e=M(t);for(const i in e)if(i in this.param){const a=i;this.param[a]=e[a]}}init_stability(t){return Math.max(this.param.w[t-1],.1)}init_difficulty(t){return this.constrain_difficulty(this.param.w[4]-Math.exp((t-1)*this.param.w[5])+1)}apply_fuzz(t,e){if(!this.param.enable_fuzz||t<2.5)return Math.round(t);const i=X(this._seed)(),{min_ivl:a,max_ivl:s}=U(t,e,this.param.maximum_interval);return Math.floor(i*(s-a+1)+a)}next_interval(t,e){const i=Math.min(Math.max(1,Math.round(t*this.intervalModifier)),this.param.maximum_interval);return this.apply_fuzz(i,e)}linear_damping(t,e){return+(t*(10-e)/9).toFixed(8)}next_difficulty(t,e){const i=-this.param.w[6]*(e-3),a=t+this.linear_damping(i,t);return this.constrain_difficulty(this.mean_reversion(this.init_difficulty(l.Easy),a))}constrain_difficulty(t){return Math.min(Math.max(+t.toFixed(8),1),10)}mean_reversion(t,e){return+(this.param.w[7]*t+(1-this.param.w[7])*e).toFixed(8)}next_recall_stability(t,e,i,a){const s=l.Hard===a?this.param.w[15]:1,n=l.Easy===a?this.param.w[16]:1;return+p(e*(1+Math.exp(this.param.w[8])*(11-t)*Math.pow(e,-this.param.w[9])*(Math.exp((1-i)*this.param.w[10])-1)*s*n),.01,36500).toFixed(8)}next_forget_stability(t,e,i){return+p(this.param.w[11]*Math.pow(t,-this.param.w[12])*(Math.pow(e+1,this.param.w[13])-1)*Math.exp((1-i)*this.param.w[14]),.01,36500).toFixed(8)}next_short_term_stability(t,e){return+p(t*Math.exp(this.param.w[17]*(e-3+this.param.w[18])),.01,36500).toFixed(8)}forgetting_curve(t,e){return+Math.pow(1+D*t/e,E).toFixed(8)}}function F(){const r=this.review_time.getTime(),t=this.current.reps,e=this.current.difficulty*this.current.stability;return`${r}_${t}_${e}`}function Z(r){return function(){const t=Reflect.get(this.current,r)??0,e=this.current.reps;return String(t+e||0)}}var v=(r=>(r.SCHEDULER="Scheduler",r.SEED="Seed",r))(v||{});class H{last;current;review_time;next=new Map;algorithm;initSeedStrategy;constructor(t,e,i,a={seed:F}){this.algorithm=i,this.initSeedStrategy=a.seed.bind(this),this.last=h.card(t),this.current=h.card(t),this.review_time=h.time(e),this.init()}init(){const{state:t,last_review:e}=this.current;let i=0;t!==o.New&&e&&(i=q(e,this.review_time)),this.current.last_review=this.review_time,this.current.elapsed_days=i,this.current.reps+=1,this.algorithm.seed=this.initSeedStrategy()}preview(){return{[l.Again]:this.review(l.Again),[l.Hard]:this.review(l.Hard),[l.Good]:this.review(l.Good),[l.Easy]:this.review(l.Easy),[Symbol.iterator]:this.previewIterator.bind(this)}}*previewIterator(){for(const t of T)yield this.review(t)}review(t){const{state:e}=this.last;let i;switch(e){case o.New:i=this.newState(t);break;case o.Learning:case o.Relearning:i=this.learningState(t);break;case o.Review:i=this.reviewState(t);break}if(i)return i;throw new Error("Invalid grade")}buildLog(t){const{last_review:e,due:i,elapsed_days:a}=this.last;return{rating:t,state:this.current.state,due:e||i,stability:this.current.stability,difficulty:this.current.difficulty,elapsed_days:this.current.elapsed_days,last_elapsed_days:a,scheduled_days:this.current.scheduled_days,review:this.review_time}}}class O extends H{newState(t){const e=this.next.get(t);if(e)return e;const i=h.card(this.current);switch(i.difficulty=this.algorithm.init_difficulty(t),i.stability=this.algorithm.init_stability(t),t){case l.Again:i.scheduled_days=0,i.due=this.review_time.scheduler(1),i.state=o.Learning;break;case l.Hard:i.scheduled_days=0,i.due=this.review_time.scheduler(5),i.state=o.Learning;break;case l.Good:i.scheduled_days=0,i.due=this.review_time.scheduler(10),i.state=o.Learning;break;case l.Easy:{const s=this.algorithm.next_interval(i.stability,this.current.elapsed_days);i.scheduled_days=s,i.due=this.review_time.scheduler(s,!0),i.state=o.Review;break}default:throw new Error("Invalid grade")}const a={card:i,log:this.buildLog(t)};return this.next.set(t,a),a}learningState(t){const e=this.next.get(t);if(e)return e;const{state:i,difficulty:a,stability:s}=this.last,n=h.card(this.current),d=this.current.elapsed_days;switch(n.difficulty=this.algorithm.next_difficulty(a,t),n.stability=this.algorithm.next_short_term_stability(s,t),t){case l.Again:{n.scheduled_days=0,n.due=this.review_time.scheduler(5,!1),n.state=i;break}case l.Hard:{n.scheduled_days=0,n.due=this.review_time.scheduler(10),n.state=i;break}case l.Good:{const c=this.algorithm.next_interval(n.stability,d);n.scheduled_days=c,n.due=this.review_time.scheduler(c,!0),n.state=o.Review;break}case l.Easy:{const c=this.algorithm.next_short_term_stability(s,l.Good),f=this.algorithm.next_interval(c,d),y=Math.max(this.algorithm.next_interval(n.stability,d),f+1);n.scheduled_days=y,n.due=this.review_time.scheduler(y,!0),n.state=o.Review;break}default:throw new Error("Invalid grade")}const u={card:n,log:this.buildLog(t)};return this.next.set(t,u),u}reviewState(t){const e=this.next.get(t);if(e)return e;const i=this.current.elapsed_days,{difficulty:a,stability:s}=this.last,n=this.algorithm.forgetting_curve(i,s),d=h.card(this.current),u=h.card(this.current),c=h.card(this.current),f=h.card(this.current);this.next_ds(d,u,c,f,a,s,n),this.next_interval(d,u,c,f,i),this.next_state(d,u,c,f),d.lapses+=1;const y={card:d,log:this.buildLog(l.Again)},x={card:u,log:super.buildLog(l.Hard)},g={card:c,log:super.buildLog(l.Good)},b={card:f,log:super.buildLog(l.Easy)};return this.next.set(l.Again,y),this.next.set(l.Hard,x),this.next.set(l.Good,g),this.next.set(l.Easy,b),this.next.get(t)}next_ds(t,e,i,a,s,n,d){t.difficulty=this.algorithm.next_difficulty(s,l.Again);const u=n/Math.exp(this.algorithm.parameters.w[17]*this.algorithm.parameters.w[18]);t.stability=Math.min(+u.toFixed(8),this.algorithm.next_forget_stability(s,n,d)),e.difficulty=this.algorithm.next_difficulty(s,l.Hard),e.stability=this.algorithm.next_recall_stability(s,n,d,l.Hard),i.difficulty=this.algorithm.next_difficulty(s,l.Good),i.stability=this.algorithm.next_recall_stability(s,n,d,l.Good),a.difficulty=this.algorithm.next_difficulty(s,l.Easy),a.stability=this.algorithm.next_recall_stability(s,n,d,l.Easy)}next_interval(t,e,i,a,s){let n,d;n=this.algorithm.next_interval(e.stability,s),d=this.algorithm.next_interval(i.stability,s),n=Math.min(n,d),d=Math.max(d,n+1);const u=Math.max(this.algorithm.next_interval(a.stability,s),d+1);t.scheduled_days=0,t.due=this.review_time.scheduler(5),e.scheduled_days=n,e.due=this.review_time.scheduler(n,!0),i.scheduled_days=d,i.due=this.review_time.scheduler(d,!0),a.scheduled_days=u,a.due=this.review_time.scheduler(u,!0)}next_state(t,e,i,a){t.state=o.Relearning,e.state=o.Review,i.state=o.Review,a.state=o.Review}}class P extends H{newState(t){const e=this.next.get(t);if(e)return e;this.current.scheduled_days=0,this.current.elapsed_days=0;const i=h.card(this.current),a=h.card(this.current),s=h.card(this.current),n=h.card(this.current);this.init_ds(i,a,s,n);const d=0;return this.next_interval(i,a,s,n,d),this.next_state(i,a,s,n),this.update_next(i,a,s,n),this.next.get(t)}init_ds(t,e,i,a){t.difficulty=this.algorithm.init_difficulty(l.Again),t.stability=this.algorithm.init_stability(l.Again),e.difficulty=this.algorithm.init_difficulty(l.Hard),e.stability=this.algorithm.init_stability(l.Hard),i.difficulty=this.algorithm.init_difficulty(l.Good),i.stability=this.algorithm.init_stability(l.Good),a.difficulty=this.algorithm.init_difficulty(l.Easy),a.stability=this.algorithm.init_stability(l.Easy)}learningState(t){return this.reviewState(t)}reviewState(t){const e=this.next.get(t);if(e)return e;const i=this.current.elapsed_days,{difficulty:a,stability:s}=this.last,n=this.algorithm.forgetting_curve(i,s),d=h.card(this.current),u=h.card(this.current),c=h.card(this.current),f=h.card(this.current);return this.next_ds(d,u,c,f,a,s,n),this.next_interval(d,u,c,f,i),this.next_state(d,u,c,f),d.lapses+=1,this.update_next(d,u,c,f),this.next.get(t)}next_ds(t,e,i,a,s,n,d){t.difficulty=this.algorithm.next_difficulty(s,l.Again),t.stability=Math.min(n,this.algorithm.next_forget_stability(s,n,d)),e.difficulty=this.algorithm.next_difficulty(s,l.Hard),e.stability=this.algorithm.next_recall_stability(s,n,d,l.Hard),i.difficulty=this.algorithm.next_difficulty(s,l.Good),i.stability=this.algorithm.next_recall_stability(s,n,d,l.Good),a.difficulty=this.algorithm.next_difficulty(s,l.Easy),a.stability=this.algorithm.next_recall_stability(s,n,d,l.Easy)}next_interval(t,e,i,a,s){let n,d,u,c;n=this.algorithm.next_interval(t.stability,s),d=this.algorithm.next_interval(e.stability,s),u=this.algorithm.next_interval(i.stability,s),c=this.algorithm.next_interval(a.stability,s),n=Math.min(n,d),d=Math.max(d,n+1),u=Math.max(u,d+1),c=Math.max(c,u+1),t.scheduled_days=n,t.due=this.review_time.scheduler(n,!0),e.scheduled_days=d,e.due=this.review_time.scheduler(d,!0),i.scheduled_days=u,i.due=this.review_time.scheduler(u,!0),a.scheduled_days=c,a.due=this.review_time.scheduler(c,!0)}next_state(t,e,i,a){t.state=o.Review,e.state=o.Review,i.state=o.Review,a.state=o.Review}update_next(t,e,i,a){const s={card:t,log:this.buildLog(l.Again)},n={card:e,log:super.buildLog(l.Hard)},d={card:i,log:super.buildLog(l.Good)},u={card:a,log:super.buildLog(l.Easy)};this.next.set(l.Again,s),this.next.set(l.Hard,n),this.next.set(l.Good,d),this.next.set(l.Easy,u)}}class tt{fsrs;constructor(t){this.fsrs=t}replay(t,e,i){return this.fsrs.next(t,e,i)}handleManualRating(t,e,i,a,s,n,d){if(typeof e>"u")throw new Error("reschedule: state is required for manual rating");let u,c;if(e===o.New)u={rating:l.Manual,state:e,due:d??i,stability:t.stability,difficulty:t.difficulty,elapsed_days:a,last_elapsed_days:t.elapsed_days,scheduled_days:t.scheduled_days,review:i},c=w(i),c.last_review=i;else{if(typeof d>"u")throw new Error("reschedule: due is required for manual rating");const f=d.diff(i,"days");u={rating:l.Manual,state:t.state,due:t.last_review||t.due,stability:t.stability,difficulty:t.difficulty,elapsed_days:a,last_elapsed_days:t.elapsed_days,scheduled_days:t.scheduled_days,review:i},c={...t,state:e,due:d,last_review:i,stability:s||t.stability,difficulty:n||t.difficulty,elapsed_days:a,scheduled_days:f,reps:t.reps+1}}return{card:c,log:u}}reschedule(t,e){const i=[];let a=w(t.due);for(const s of e){let n;if(s.review=h.time(s.review),s.rating===l.Manual){let d=0;a.state!==o.New&&a.last_review&&(d=s.review.diff(a.last_review,"days")),n=this.handleManualRating(a,s.state,s.review,d,s.stability,s.difficulty,s.due?h.time(s.due):void 0)}else n=this.replay(a,s.review,s.rating);i.push(n),a=n.card}return i}calculateManualRecord(t,e,i,a){if(!i)return null;const{card:s,log:n}=i,d=h.card(t);return d.due.getTime()===s.due.getTime()?null:(d.scheduled_days=s.due.diff(d.due,"days"),this.handleManualRating(d,s.state,h.time(e),n.elapsed_days,a?s.stability:void 0,a?s.difficulty:void 0,s.due))}}class V extends Y{strategyHandler=new Map;Scheduler;constructor(t){super(t);const{enable_short_term:e}=this.parameters;this.Scheduler=e?O:P}params_handler_proxy(){const t=this;return{set:function(e,i,a){return i==="request_retention"&&Number.isFinite(a)?t.intervalModifier=t.calculate_interval_modifier(Number(a)):i==="enable_short_term"&&(t.Scheduler=a===!0?O:P),Reflect.set(e,i,a),!0}}}useStrategy(t,e){return this.strategyHandler.set(t,e),this}clearStrategy(t){return t?this.strategyHandler.delete(t):this.strategyHandler.clear(),this}getScheduler(t,e){const i=this.strategyHandler.get(v.SEED),a=this.strategyHandler.get(v.SCHEDULER)||this.Scheduler,s=i||F;return new a(t,e,this,{seed:s})}repeat(t,e,i){const a=this.getScheduler(t,e).preview();return i&&typeof i=="function"?i(a):a}next(t,e,i,a){const s=this.getScheduler(t,e),n=h.rating(i);if(n===l.Manual)throw new Error("Cannot review a manual rating");const d=s.review(n);return a&&typeof a=="function"?a(d):d}get_retrievability(t,e,i=!0){const a=h.card(t);e=e?h.time(e):new Date;const s=a.state!==o.New?Math.max(e.diff(a.last_review,"days"),0):0,n=a.state!==o.New?this.forgetting_curve(s,+a.stability.toFixed(8)):0;return i?`${(n*100).toFixed(2)}%`:n}rollback(t,e,i){const a=h.card(t),s=h.review_log(e);if(s.rating===l.Manual)throw new Error("Cannot rollback a manual rating");let n,d,u;switch(s.state){case o.New:n=s.due,d=void 0,u=0;break;case o.Learning:case o.Relearning:case o.Review:n=s.review,d=s.due,u=a.lapses-(s.rating===l.Again&&s.state===o.Review?1:0);break}const c={...a,due:n,stability:s.stability,difficulty:s.difficulty,elapsed_days:s.last_elapsed_days,scheduled_days:s.scheduled_days,reps:Math.max(0,a.reps-1),lapses:Math.max(0,u),state:s.state,last_review:d};return i&&typeof i=="function"?i(c):c}forget(t,e,i=!1,a){const s=h.card(t);e=h.time(e);const n=s.state===o.New?0:e.diff(s.last_review,"days"),d={rating:l.Manual,state:s.state,due:s.due,stability:s.stability,difficulty:s.difficulty,elapsed_days:0,last_elapsed_days:s.elapsed_days,scheduled_days:n,review:e},u={card:{...s,due:e,stability:0,difficulty:0,elapsed_days:0,scheduled_days:0,reps:i?0:s.reps,lapses:i?0:s.lapses,state:o.New,last_review:s.last_review},log:d};return a&&typeof a=="function"?a(u):u}reschedule(t,e=[],i={}){const{recordLogHandler:a,reviewsOrderBy:s,skipManual:n=!0,now:d=new Date,update_memory_state:u=!1}=i;s&&typeof s=="function"&&e.sort(s),n&&(e=e.filter(b=>b.rating!==l.Manual));const c=new tt(this),f=c.reschedule(i.first_card||w(),e),y=f.length,x=h.card(t),g=c.calculateManualRecord(x,d,y?f[y-1]:void 0,u);return a&&typeof a=="function"?{collections:f.map(a),reschedule_item:g?a(g):null}:{collections:f,reschedule_item:g}}}const et=r=>new V(r||{});exports.AbstractScheduler=H,exports.DECAY=E,exports.DefaultInitSeedStrategy=F,exports.FACTOR=D,exports.FSRS=V,exports.FSRSAlgorithm=Y,exports.FSRSVersion=j,exports.GenSeedStrategyWithCardId=Z,exports.Grades=T,exports.Rating=l,exports.State=o,exports.StrategyMode=v,exports.TypeConvert=h,exports.clamp=p,exports.createEmptyCard=w,exports.dateDiffInDays=q,exports.date_diff=z,exports.date_scheduler=k,exports.default_enable_fuzz=G,exports.default_enable_short_term=C,exports.default_maximum_interval=$,exports.default_request_retention=A,exports.default_w=L,exports.fixDate=_,exports.fixRating=B,exports.fixState=W,exports.formatDate=I,exports.fsrs=et,exports.generatorParameters=M,exports.get_fuzz_range=U,exports.show_diff_message=N,module.exports=Object.assign(exports.default||{},exports);
|
|
1
|
+
"use strict";var c=(r=>(r[r.New=0]="New",r[r.Learning=1]="Learning",r[r.Review=2]="Review",r[r.Relearning=3]="Relearning",r))(c||{}),l=(r=>(r[r.Manual=0]="Manual",r[r.Again=1]="Again",r[r.Hard=2]="Hard",r[r.Good=3]="Good",r[r.Easy=4]="Easy",r))(l||{});class o{static card(t){return{...t,state:o.state(t.state),due:o.time(t.due),last_review:t.last_review?o.time(t.last_review):void 0}}static rating(t){if(typeof t=="string"){const e=t.charAt(0).toUpperCase(),i=t.slice(1).toLowerCase(),a=l[`${e}${i}`];if(a===void 0)throw new Error(`Invalid rating:[${t}]`);return a}else if(typeof t=="number")return t;throw new Error(`Invalid rating:[${t}]`)}static state(t){if(typeof t=="string"){const e=t.charAt(0).toUpperCase(),i=t.slice(1).toLowerCase(),a=c[`${e}${i}`];if(a===void 0)throw new Error(`Invalid state:[${t}]`);return a}else if(typeof t=="number")return t;throw new Error(`Invalid state:[${t}]`)}static time(t){if(typeof t=="object"&&t instanceof Date)return t;if(typeof t=="string"){const e=Date.parse(t);if(isNaN(e))throw new Error(`Invalid date:[${t}]`);return new Date(e)}else if(typeof t=="number")return new Date(t);throw new Error(`Invalid date:[${t}]`)}static review_log(t){return{...t,due:o.time(t.due),rating:o.rating(t.rating),state:o.state(t.state),review:o.time(t.review)}}}const B="4.6.1";Date.prototype.scheduler=function(r,t){return L(this,r,t)},Date.prototype.diff=function(r,t){return C(this,r,t)},Date.prototype.format=function(){return G(this)},Date.prototype.dueFormat=function(r,t,e){return N(this,r,t,e)};function L(r,t,e){return new Date(e?g(r).getTime()+t*24*60*60*1e3:g(r).getTime()+t*60*1e3)}function C(r,t,e){if(!r||!t)throw new Error("Invalid date");const i=g(r).getTime()-g(t).getTime();let a=0;switch(e){case"days":a=Math.floor(i/(24*60*60*1e3));break;case"minutes":a=Math.floor(i/(60*1e3));break}return a}function G(r){const t=g(r),e=t.getFullYear(),i=t.getMonth()+1,a=t.getDate(),s=t.getHours(),n=t.getMinutes(),d=t.getSeconds();return`${e}-${v(i)}-${v(a)} ${v(s)}:${v(n)}:${v(d)}`}function v(r){return r<10?`0${r}`:`${r}`}const E=[60,60,24,31,12],R=["second","min","hour","day","month","year"];function N(r,t,e,i=R){r=g(r),t=g(t),i.length!==R.length&&(i=R);let a=r.getTime()-t.getTime(),s;for(a/=1e3,s=0;s<E.length&&!(a<E[s]);s++)a/=E[s];return`${Math.floor(a)}${e?i[s]:""}`}function g(r){return o.time(r)}function J(r){return o.state(r)}function K(r){return o.rating(r)}const k=[l.Again,l.Hard,l.Good,l.Easy],Q=[{start:2.5,end:7,factor:.15},{start:7,end:20,factor:.1},{start:20,end:1/0,factor:.05}];function z(r,t,e){let i=1;for(const n of Q)i+=n.factor*Math.max(Math.min(r,n.end)-n.start,0);r=Math.min(r,e);let a=Math.max(2,Math.round(r-i));const s=Math.min(Math.round(r+i),e);return r>t&&(a=Math.max(a,t+1)),a=Math.min(a,s),{min_ivl:a,max_ivl:s}}function m(r,t,e){return Math.min(Math.max(r,t),e)}function T(r,t){const e=Date.UTC(r.getUTCFullYear(),r.getUTCMonth(),r.getUTCDate()),i=Date.UTC(t.getUTCFullYear(),t.getUTCMonth(),t.getUTCDate());return Math.floor((i-e)/864e5)}const U=.9,q=36500,P=[.40255,1.18385,3.173,15.69105,7.1949,.5345,1.4604,.0046,1.54575,.1192,1.01925,1.9395,.11,.29605,2.2698,.2315,2.9898,.51655,.6621],Y=!1,O=!0,Z=`v${B} using FSRS-5.0`,_=.01,x=100,A=[[_,x],[_,x],[_,x],[_,x],[1,10],[.001,4],[.001,4],[.001,.75],[0,4.5],[0,.8],[.001,3.5],[.001,5],[.001,.25],[.001,.9],[0,4],[0,1],[1,6],[0,2],[0,2]],D=r=>{let t=P;return r?.w&&(r.w.length===19?t=r?.w:r.w.length===17&&(t=r?.w.concat([0,0]),t[4]=+(t[5]*2+t[4]).toFixed(8),t[5]=+(Math.log(t[5]*3+1)/3).toFixed(8),t[6]=+(t[6]+.5).toFixed(8),console.debug("[FSRS V5]auto fill w to 19 length"))),t=t.map((e,i)=>m(e,A[i][0],A[i][1])),{request_retention:r?.request_retention||U,maximum_interval:r?.maximum_interval||q,w:t,enable_fuzz:r?.enable_fuzz??Y,enable_short_term:r?.enable_short_term??O}};function b(r,t){const e={due:r?o.time(r):new Date,stability:0,difficulty:0,elapsed_days:0,scheduled_days:0,reps:0,lapses:0,state:c.New,last_review:void 0};return t&&typeof t=="function"?t(e):e}class tt{c;s0;s1;s2;constructor(t){const e=et();this.c=1,this.s0=e(" "),this.s1=e(" "),this.s2=e(" "),t==null&&(t=+new Date),this.s0-=e(t),this.s0<0&&(this.s0+=1),this.s1-=e(t),this.s1<0&&(this.s1+=1),this.s2-=e(t),this.s2<0&&(this.s2+=1)}next(){const t=2091639*this.s0+this.c*23283064365386963e-26;return this.s0=this.s1,this.s1=this.s2,this.s2=t-(this.c=t|0),this.s2}set state(t){this.c=t.c,this.s0=t.s0,this.s1=t.s1,this.s2=t.s2}get state(){return{c:this.c,s0:this.s0,s1:this.s1,s2:this.s2}}}function et(){let r=4022871197;return function(t){t=String(t);for(let e=0;e<t.length;e++){r+=t.charCodeAt(e);let i=.02519603282416938*r;r=i>>>0,i-=r,i*=r,r=i>>>0,i-=r,r+=i*4294967296}return(r>>>0)*23283064365386963e-26}}function it(r){const t=new tt(r),e=()=>t.next();return e.int32=()=>t.next()*4294967296|0,e.double=()=>e()+(e()*2097152|0)*11102230246251565e-32,e.state=()=>t.state,e.importState=i=>(t.state=i,e),e}const F=-.5,$=19/81;class V{param;intervalModifier;_seed;constructor(t){this.param=new Proxy(D(t),this.params_handler_proxy()),this.intervalModifier=this.calculate_interval_modifier(this.param.request_retention)}get interval_modifier(){return this.intervalModifier}set seed(t){this._seed=t}calculate_interval_modifier(t){if(t<=0||t>1)throw new Error("Requested retention rate should be in the range (0,1]");return+((Math.pow(t,1/F)-1)/$).toFixed(8)}get parameters(){return this.param}set parameters(t){this.update_parameters(t)}params_handler_proxy(){const t=this;return{set:function(e,i,a){return i==="request_retention"&&Number.isFinite(a)&&(t.intervalModifier=t.calculate_interval_modifier(Number(a))),Reflect.set(e,i,a),!0}}}update_parameters(t){const e=D(t);for(const i in e)if(i in this.param){const a=i;this.param[a]=e[a]}}init_stability(t){return Math.max(this.param.w[t-1],.1)}init_difficulty(t){return this.constrain_difficulty(this.param.w[4]-Math.exp((t-1)*this.param.w[5])+1)}apply_fuzz(t,e){if(!this.param.enable_fuzz||t<2.5)return Math.round(t);const i=it(this._seed)(),{min_ivl:a,max_ivl:s}=z(t,e,this.param.maximum_interval);return Math.floor(i*(s-a+1)+a)}next_interval(t,e){const i=Math.min(Math.max(1,Math.round(t*this.intervalModifier)),this.param.maximum_interval);return this.apply_fuzz(i,e)}linear_damping(t,e){return+(t*(10-e)/9).toFixed(8)}next_difficulty(t,e){const i=-this.param.w[6]*(e-3),a=t+this.linear_damping(i,t);return this.constrain_difficulty(this.mean_reversion(this.init_difficulty(l.Easy),a))}constrain_difficulty(t){return Math.min(Math.max(+t.toFixed(8),1),10)}mean_reversion(t,e){return+(this.param.w[7]*t+(1-this.param.w[7])*e).toFixed(8)}next_recall_stability(t,e,i,a){const s=l.Hard===a?this.param.w[15]:1,n=l.Easy===a?this.param.w[16]:1;return+m(e*(1+Math.exp(this.param.w[8])*(11-t)*Math.pow(e,-this.param.w[9])*(Math.exp((1-i)*this.param.w[10])-1)*s*n),_,36500).toFixed(8)}next_forget_stability(t,e,i){return+m(this.param.w[11]*Math.pow(t,-this.param.w[12])*(Math.pow(e+1,this.param.w[13])-1)*Math.exp((1-i)*this.param.w[14]),_,36500).toFixed(8)}next_short_term_stability(t,e){return+m(t*Math.exp(this.param.w[17]*(e-3+this.param.w[18])),_,36500).toFixed(8)}forgetting_curve(t,e){return+Math.pow(1+$*t/e,F).toFixed(8)}next_state(t,e,i){const{difficulty:a,stability:s}=t??{difficulty:0,stability:0};if(e<0)throw new Error(`Invalid delta_t "${e}"`);if(i<0||i>4)throw new Error(`Invalid grade "${i}"`);if(a===0&&s===0)return{difficulty:this.init_difficulty(i),stability:this.init_stability(i)};if(i===0)return{difficulty:a,stability:s};if(a<1||s<_)throw new Error(`Invalid memory state { difficulty: ${a}, stability: ${s} }`);const n=this.forgetting_curve(e,s),d=this.next_recall_stability(a,s,n,i),h=this.next_forget_stability(a,s,n),u=this.next_short_term_stability(s,i);let f=d;if(i===1){let[y,p]=[0,0];this.param.enable_short_term&&(y=this.param.w[17],p=this.param.w[18]);const w=s/Math.exp(y*p);f=m(+w.toFixed(8),_,h)}return e===0&&this.param.enable_short_term&&(f=u),{difficulty:this.next_difficulty(a,i),stability:f}}}function H(){const r=this.review_time.getTime(),t=this.current.reps,e=this.current.difficulty*this.current.stability;return`${r}_${t}_${e}`}function at(r){return function(){const t=Reflect.get(this.current,r)??0,e=this.current.reps;return String(t+e||0)}}var M=(r=>(r.SCHEDULER="Scheduler",r.SEED="Seed",r))(M||{});class I{last;current;review_time;next=new Map;algorithm;initSeedStrategy;constructor(t,e,i,a={seed:H}){this.algorithm=i,this.initSeedStrategy=a.seed.bind(this),this.last=o.card(t),this.current=o.card(t),this.review_time=o.time(e),this.init()}init(){const{state:t,last_review:e}=this.current;let i=0;t!==c.New&&e&&(i=T(e,this.review_time)),this.current.last_review=this.review_time,this.current.elapsed_days=i,this.current.reps+=1,this.algorithm.seed=this.initSeedStrategy()}preview(){return{[l.Again]:this.review(l.Again),[l.Hard]:this.review(l.Hard),[l.Good]:this.review(l.Good),[l.Easy]:this.review(l.Easy),[Symbol.iterator]:this.previewIterator.bind(this)}}*previewIterator(){for(const t of k)yield this.review(t)}review(t){const{state:e}=this.last;let i;switch(e){case c.New:i=this.newState(t);break;case c.Learning:case c.Relearning:i=this.learningState(t);break;case c.Review:i=this.reviewState(t);break}if(i)return i;throw new Error("Invalid grade")}buildLog(t){const{last_review:e,due:i,elapsed_days:a}=this.last;return{rating:t,state:this.current.state,due:e||i,stability:this.current.stability,difficulty:this.current.difficulty,elapsed_days:this.current.elapsed_days,last_elapsed_days:a,scheduled_days:this.current.scheduled_days,review:this.review_time}}}class j extends I{newState(t){const e=this.next.get(t);if(e)return e;const i=o.card(this.current);switch(i.difficulty=this.algorithm.init_difficulty(t),i.stability=this.algorithm.init_stability(t),t){case l.Again:i.scheduled_days=0,i.due=this.review_time.scheduler(1),i.state=c.Learning;break;case l.Hard:i.scheduled_days=0,i.due=this.review_time.scheduler(5),i.state=c.Learning;break;case l.Good:i.scheduled_days=0,i.due=this.review_time.scheduler(10),i.state=c.Learning;break;case l.Easy:{const s=this.algorithm.next_interval(i.stability,this.current.elapsed_days);i.scheduled_days=s,i.due=this.review_time.scheduler(s,!0),i.state=c.Review;break}default:throw new Error("Invalid grade")}const a={card:i,log:this.buildLog(t)};return this.next.set(t,a),a}learningState(t){const e=this.next.get(t);if(e)return e;const{state:i,difficulty:a,stability:s}=this.last,n=o.card(this.current),d=this.current.elapsed_days;switch(n.difficulty=this.algorithm.next_difficulty(a,t),n.stability=this.algorithm.next_short_term_stability(s,t),t){case l.Again:{n.scheduled_days=0,n.due=this.review_time.scheduler(5,!1),n.state=i;break}case l.Hard:{n.scheduled_days=0,n.due=this.review_time.scheduler(10),n.state=i;break}case l.Good:{const u=this.algorithm.next_interval(n.stability,d);n.scheduled_days=u,n.due=this.review_time.scheduler(u,!0),n.state=c.Review;break}case l.Easy:{const u=this.algorithm.next_short_term_stability(s,l.Good),f=this.algorithm.next_interval(u,d),y=Math.max(this.algorithm.next_interval(n.stability,d),f+1);n.scheduled_days=y,n.due=this.review_time.scheduler(y,!0),n.state=c.Review;break}default:throw new Error("Invalid grade")}const h={card:n,log:this.buildLog(t)};return this.next.set(t,h),h}reviewState(t){const e=this.next.get(t);if(e)return e;const i=this.current.elapsed_days,{difficulty:a,stability:s}=this.last,n=this.algorithm.forgetting_curve(i,s),d=o.card(this.current),h=o.card(this.current),u=o.card(this.current),f=o.card(this.current);this.next_ds(d,h,u,f,a,s,n),this.next_interval(d,h,u,f,i),this.next_state(d,h,u,f),d.lapses+=1;const y={card:d,log:this.buildLog(l.Again)},p={card:h,log:super.buildLog(l.Hard)},w={card:u,log:super.buildLog(l.Good)},S={card:f,log:super.buildLog(l.Easy)};return this.next.set(l.Again,y),this.next.set(l.Hard,p),this.next.set(l.Good,w),this.next.set(l.Easy,S),this.next.get(t)}next_ds(t,e,i,a,s,n,d){t.difficulty=this.algorithm.next_difficulty(s,l.Again);const h=n/Math.exp(this.algorithm.parameters.w[17]*this.algorithm.parameters.w[18]),u=this.algorithm.next_forget_stability(s,n,d);t.stability=m(+h.toFixed(8),_,u),e.difficulty=this.algorithm.next_difficulty(s,l.Hard),e.stability=this.algorithm.next_recall_stability(s,n,d,l.Hard),i.difficulty=this.algorithm.next_difficulty(s,l.Good),i.stability=this.algorithm.next_recall_stability(s,n,d,l.Good),a.difficulty=this.algorithm.next_difficulty(s,l.Easy),a.stability=this.algorithm.next_recall_stability(s,n,d,l.Easy)}next_interval(t,e,i,a,s){let n,d;n=this.algorithm.next_interval(e.stability,s),d=this.algorithm.next_interval(i.stability,s),n=Math.min(n,d),d=Math.max(d,n+1);const h=Math.max(this.algorithm.next_interval(a.stability,s),d+1);t.scheduled_days=0,t.due=this.review_time.scheduler(5),e.scheduled_days=n,e.due=this.review_time.scheduler(n,!0),i.scheduled_days=d,i.due=this.review_time.scheduler(d,!0),a.scheduled_days=h,a.due=this.review_time.scheduler(h,!0)}next_state(t,e,i,a){t.state=c.Relearning,e.state=c.Review,i.state=c.Review,a.state=c.Review}}class W extends I{newState(t){const e=this.next.get(t);if(e)return e;this.current.scheduled_days=0,this.current.elapsed_days=0;const i=o.card(this.current),a=o.card(this.current),s=o.card(this.current),n=o.card(this.current);return this.init_ds(i,a,s,n),this.next_interval(i,a,s,n,0),this.next_state(i,a,s,n),this.update_next(i,a,s,n),this.next.get(t)}init_ds(t,e,i,a){t.difficulty=this.algorithm.init_difficulty(l.Again),t.stability=this.algorithm.init_stability(l.Again),e.difficulty=this.algorithm.init_difficulty(l.Hard),e.stability=this.algorithm.init_stability(l.Hard),i.difficulty=this.algorithm.init_difficulty(l.Good),i.stability=this.algorithm.init_stability(l.Good),a.difficulty=this.algorithm.init_difficulty(l.Easy),a.stability=this.algorithm.init_stability(l.Easy)}learningState(t){return this.reviewState(t)}reviewState(t){const e=this.next.get(t);if(e)return e;const i=this.current.elapsed_days,{difficulty:a,stability:s}=this.last,n=this.algorithm.forgetting_curve(i,s),d=o.card(this.current),h=o.card(this.current),u=o.card(this.current),f=o.card(this.current);return this.next_ds(d,h,u,f,a,s,n),this.next_interval(d,h,u,f,i),this.next_state(d,h,u,f),d.lapses+=1,this.update_next(d,h,u,f),this.next.get(t)}next_ds(t,e,i,a,s,n,d){t.difficulty=this.algorithm.next_difficulty(s,l.Again);const h=this.algorithm.next_forget_stability(s,n,d);t.stability=m(n,_,h),e.difficulty=this.algorithm.next_difficulty(s,l.Hard),e.stability=this.algorithm.next_recall_stability(s,n,d,l.Hard),i.difficulty=this.algorithm.next_difficulty(s,l.Good),i.stability=this.algorithm.next_recall_stability(s,n,d,l.Good),a.difficulty=this.algorithm.next_difficulty(s,l.Easy),a.stability=this.algorithm.next_recall_stability(s,n,d,l.Easy)}next_interval(t,e,i,a,s){let n,d,h,u;n=this.algorithm.next_interval(t.stability,s),d=this.algorithm.next_interval(e.stability,s),h=this.algorithm.next_interval(i.stability,s),u=this.algorithm.next_interval(a.stability,s),n=Math.min(n,d),d=Math.max(d,n+1),h=Math.max(h,d+1),u=Math.max(u,h+1),t.scheduled_days=n,t.due=this.review_time.scheduler(n,!0),e.scheduled_days=d,e.due=this.review_time.scheduler(d,!0),i.scheduled_days=h,i.due=this.review_time.scheduler(h,!0),a.scheduled_days=u,a.due=this.review_time.scheduler(u,!0)}next_state(t,e,i,a){t.state=c.Review,e.state=c.Review,i.state=c.Review,a.state=c.Review}update_next(t,e,i,a){const s={card:t,log:this.buildLog(l.Again)},n={card:e,log:super.buildLog(l.Hard)},d={card:i,log:super.buildLog(l.Good)},h={card:a,log:super.buildLog(l.Easy)};this.next.set(l.Again,s),this.next.set(l.Hard,n),this.next.set(l.Good,d),this.next.set(l.Easy,h)}}class st{fsrs;constructor(t){this.fsrs=t}replay(t,e,i){return this.fsrs.next(t,e,i)}handleManualRating(t,e,i,a,s,n,d){if(typeof e>"u")throw new Error("reschedule: state is required for manual rating");let h,u;if(e===c.New)h={rating:l.Manual,state:e,due:d??i,stability:t.stability,difficulty:t.difficulty,elapsed_days:a,last_elapsed_days:t.elapsed_days,scheduled_days:t.scheduled_days,review:i},u=b(i),u.last_review=i;else{if(typeof d>"u")throw new Error("reschedule: due is required for manual rating");const f=d.diff(i,"days");h={rating:l.Manual,state:t.state,due:t.last_review||t.due,stability:t.stability,difficulty:t.difficulty,elapsed_days:a,last_elapsed_days:t.elapsed_days,scheduled_days:t.scheduled_days,review:i},u={...t,state:e,due:d,last_review:i,stability:s||t.stability,difficulty:n||t.difficulty,elapsed_days:a,scheduled_days:f,reps:t.reps+1}}return{card:u,log:h}}reschedule(t,e){const i=[];let a=b(t.due);for(const s of e){let n;if(s.review=o.time(s.review),s.rating===l.Manual){let d=0;a.state!==c.New&&a.last_review&&(d=s.review.diff(a.last_review,"days")),n=this.handleManualRating(a,s.state,s.review,d,s.stability,s.difficulty,s.due?o.time(s.due):void 0)}else n=this.replay(a,s.review,s.rating);i.push(n),a=n.card}return i}calculateManualRecord(t,e,i,a){if(!i)return null;const{card:s,log:n}=i,d=o.card(t);return d.due.getTime()===s.due.getTime()?null:(d.scheduled_days=s.due.diff(d.due,"days"),this.handleManualRating(d,s.state,o.time(e),n.elapsed_days,a?s.stability:void 0,a?s.difficulty:void 0,s.due))}}class X extends V{strategyHandler=new Map;Scheduler;constructor(t){super(t);const{enable_short_term:e}=this.parameters;this.Scheduler=e?j:W}params_handler_proxy(){const t=this;return{set:function(e,i,a){return i==="request_retention"&&Number.isFinite(a)?t.intervalModifier=t.calculate_interval_modifier(Number(a)):i==="enable_short_term"&&(t.Scheduler=a===!0?j:W),Reflect.set(e,i,a),!0}}}useStrategy(t,e){return this.strategyHandler.set(t,e),this}clearStrategy(t){return t?this.strategyHandler.delete(t):this.strategyHandler.clear(),this}getScheduler(t,e){const i=this.strategyHandler.get(M.SEED),a=this.strategyHandler.get(M.SCHEDULER)||this.Scheduler,s=i||H;return new a(t,e,this,{seed:s})}repeat(t,e,i){const a=this.getScheduler(t,e).preview();return i&&typeof i=="function"?i(a):a}next(t,e,i,a){const s=this.getScheduler(t,e),n=o.rating(i);if(n===l.Manual)throw new Error("Cannot review a manual rating");const d=s.review(n);return a&&typeof a=="function"?a(d):d}get_retrievability(t,e,i=!0){const a=o.card(t);e=e?o.time(e):new Date;const s=a.state!==c.New?Math.max(e.diff(a.last_review,"days"),0):0,n=a.state!==c.New?this.forgetting_curve(s,+a.stability.toFixed(8)):0;return i?`${(n*100).toFixed(2)}%`:n}rollback(t,e,i){const a=o.card(t),s=o.review_log(e);if(s.rating===l.Manual)throw new Error("Cannot rollback a manual rating");let n,d,h;switch(s.state){case c.New:n=s.due,d=void 0,h=0;break;case c.Learning:case c.Relearning:case c.Review:n=s.review,d=s.due,h=a.lapses-(s.rating===l.Again&&s.state===c.Review?1:0);break}const u={...a,due:n,stability:s.stability,difficulty:s.difficulty,elapsed_days:s.last_elapsed_days,scheduled_days:s.scheduled_days,reps:Math.max(0,a.reps-1),lapses:Math.max(0,h),state:s.state,last_review:d};return i&&typeof i=="function"?i(u):u}forget(t,e,i=!1,a){const s=o.card(t);e=o.time(e);const n=s.state===c.New?0:e.diff(s.last_review,"days"),d={rating:l.Manual,state:s.state,due:s.due,stability:s.stability,difficulty:s.difficulty,elapsed_days:0,last_elapsed_days:s.elapsed_days,scheduled_days:n,review:e},h={card:{...s,due:e,stability:0,difficulty:0,elapsed_days:0,scheduled_days:0,reps:i?0:s.reps,lapses:i?0:s.lapses,state:c.New,last_review:s.last_review},log:d};return a&&typeof a=="function"?a(h):h}reschedule(t,e=[],i={}){const{recordLogHandler:a,reviewsOrderBy:s,skipManual:n=!0,now:d=new Date,update_memory_state:h=!1}=i;s&&typeof s=="function"&&e.sort(s),n&&(e=e.filter(S=>S.rating!==l.Manual));const u=new st(this),f=u.reschedule(i.first_card||b(),e),y=f.length,p=o.card(t),w=u.calculateManualRecord(p,d,y?f[y-1]:void 0,h);return a&&typeof a=="function"?{collections:f.map(a),reschedule_item:w?a(w):null}:{collections:f,reschedule_item:w}}}const rt=r=>new X(r||{});exports.AbstractScheduler=I,exports.CLAMP_PARAMETERS=A,exports.DECAY=F,exports.DefaultInitSeedStrategy=H,exports.FACTOR=$,exports.FSRS=X,exports.FSRSAlgorithm=V,exports.FSRSVersion=Z,exports.GenSeedStrategyWithCardId=at,exports.Grades=k,exports.INIT_S_MAX=x,exports.Rating=l,exports.S_MIN=_,exports.State=c,exports.StrategyMode=M,exports.TypeConvert=o,exports.clamp=m,exports.createEmptyCard=b,exports.dateDiffInDays=T,exports.date_diff=C,exports.date_scheduler=L,exports.default_enable_fuzz=Y,exports.default_enable_short_term=O,exports.default_maximum_interval=q,exports.default_request_retention=U,exports.default_w=P,exports.fixDate=g,exports.fixRating=K,exports.fixState=J,exports.formatDate=G,exports.fsrs=rt,exports.generatorParameters=D,exports.get_fuzz_range=z,exports.show_diff_message=N,module.exports=Object.assign(exports.default||{},exports);
|
|
2
2
|
//# sourceMappingURL=index.cjs.map
|