defmodule Chi2fit.Collector do
# Copyright 2016-2017 Pieter Rijken
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
use Agent, shutdown: 1_000, restart:
@moduledoc """
Implements an agent for collecting data.
"""
def start_link do
Agent.start_link(fn -> [] end, name: __MODULE__)
end
defp capture(out \\ []) do
receive do
{:io_request, from, refid, {:put_chars, :unicode, data}} ->
send from, {:io_reply, refid, :ok}
capture [data|out]
{:stop, from} ->
send from, {:data, Enum.reverse(out)}
:ok
:shutdown ->
:ok
msg ->
raise ArgumentError, "[Collector] Received unexpected message: #{inspect msg}"
end
end
def collect, do: Agent.cast(__MODULE__, fn _ -> capture() end)
def value do
send __MODULE__, {:stop, self()}
receive do
{:data, data} -> Agent.update(__MODULE__, fn _ -> data end)
end
Agent.get(__MODULE__, fn acc -> acc end)
end
def stop do
send __MODULE__, :shutdown
Agent.stop(__MODULE__)
end
end