У меня есть структура Sequence
, состоящая из функции state
и generator
, которая генерирует новое состояние из старого. Я хочу написать функцию limit
, которая возвращает новую последовательность, которая должна возвращать новое состояние в точности n
times at max и каждые n + k
время, которое оно должно вернуть nil
. Код до сих пор:
defmodule Sequence do
defstruct [:state, :generator]
def generate(%Sequence{state: nil}) do
nil
end
def generate(%Sequence{state: state , generator: generator } = seq) do
{old_state, new_state} = generator.(state)
{ old_state, %Sequence{ seq | state: new_state } }
end
def limit(%Sequence{ generator: generator } = seq, n) when n > -1 do
lim_gen = create_limit_gen(generator, n)
%Sequence{ seq | generator: lim_gen }
end
defp create_limit_gen(generator, n) do
lim_gen = fn
nil ->
nil
_ when n == 0 ->
nil
st ->
IO.puts(n) # no closure happens here
n = n - 1
generator.(st)
end
lim_gen
end
end
Я хочу получить следующие результаты:
iex> seq = %Sequence{state: 0, generator: &{&1, &1 + 1}} |> Sequence.limit 2
iex> {n, seq} = seq |> Sequence.generate; n
0
iex> {n, seq} = seq |> Sequence.generate; n
1
iex> seq |> Sequence.generate
nil
iex> seq = %Sequence{state: 0, generator: &{&1, nil}} |> Sequence.limit 2
iex> {n, seq} = seq |> Sequence.generate; n
0
iex> seq |> Sequence.generate
nil
Проблема в том, что IO.puts
печатает всегда одно и то же число, то есть оно не изменяется. Однако мой лимит-генератор зависит от этого значения, и он меняется в закрытии. В чем проблема и как ее исправить? Любая помощь приветствуется:)
PS: мне не разрешено добавлять новые поля в структуру, и я не хочу использовать такие вещи, как GenServer
и ETS