Packages
kino
0.1.1
0.19.0
0.18.0
0.17.0
0.16.1
0.16.0
0.15.3
0.15.2
0.15.1
0.15.0
0.14.2
0.14.1
0.14.0
0.13.2
0.13.1
0.13.0
0.12.3
0.12.2
0.12.1
0.12.0
0.11.3
0.11.2
0.11.1
0.11.0
0.10.0
0.9.4
0.9.3
0.9.2
0.9.1
0.9.0
0.8.1
0.8.0
0.7.0
0.6.2
0.6.1
0.6.0
retired
0.5.2
0.5.1
0.5.0
0.4.1
0.4.0
0.3.1
0.3.0
0.2.3
0.2.2
0.2.1
0.2.0
0.1.3
0.1.2
0.1.1
0.1.0
Interactive widgets for Livebook
Current section
Files
Jump to
Current section
Files
lib/kino.ex
defmodule Kino do
@moduledoc """
Interactive widgets for Livebook.
"""
@doc """
Sends the given term as cell output.
You can think of this function as a generalized
`IO.puts/2` that works for any type and is rendered
by Livebook similarly to regular evaluation results.
## Examples
Arbitrary data structure
Kino.render([%{name: "Jake Peralta"}, %{name: "Amy Santiago"}])
VegaLite plot
Vl.new(...)
|> Vl.data_from_series(...)
|> ...
|> Kino.render()
# more code
Widgets
vl_widget =
Vl.new(...)
|> Vl.data_from_series(...)
|> ...
|> Kino.VegaLite.start()
Kino.render(vl_widget)
# stream data to the plot
"""
@spec render(term()) :: term()
def render(term) do
gl = Process.group_leader()
ref = Process.monitor(gl)
output = Kino.Render.to_livebook(term)
send(gl, {:io_request, self(), ref, {:livebook_put_output, output}})
receive do
{:io_reply, ^ref, :ok} -> :ok
{:io_reply, ^ref, _} -> :error
{:DOWN, ^ref, :process, _object, _reason} -> :error
end
Process.demonitor(ref)
term
end
end