JavaScript の例(5) (TypeScript)
TypeScript 版も同様に修正します。
Numbers クラスから CurrentDigit プロパティと current_digit を削除し、コピーするメソッドを追加します。
Copy(): Numbers { return new Numbers(this.number, this.square_difference, this.scale); }
UnfoldL 関数を作成します。Iterate を UnfoldL で置き換えます。
function* UnfoldL<T, U>(next: (T) => [U, T], init: T): Iterable<U> { var src: T = init; for (; ;) { var cpl: [U, T] = next(src); // 終了したとき next は null を返すとする if (cpl == null) { break; } yield cpl[0]; src = cpl[1]; } }
NextNumbers を以下の NextDigitAndNumbers で置き換えます。
function NextDigitAndNumbers(numbers): [number, Numbers] { var numbers_copy: Numbers = numbers.Copy(); var dd: number = numbers_copy.GetNextDecimalDigit(); return [dd, numbers_copy]; }
Calc クラスの IterateServer メソッドは以下のように UnfoldL を使うように変更します。GetNextDecimalDigit を1回呼び出しているところは削除します。
IterateServer(): string { var number = new LongDecimal([]); var square_difference = new LongDecimal([3]); var init_numbers = new Numbers(number, square_difference, 0); return new LongDecimal(Take(this.count, UnfoldL(NextDigitAndNumbers, init_numbers))).Print(); }