Packages
livebook
0.16.3
0.19.8
0.19.7
0.19.6
0.19.5
0.19.4
0.19.3
0.19.2
0.19.1
0.19.0
0.18.6
0.18.5
0.18.4
0.18.3
0.18.2
0.18.1
0.18.0
0.17.3
0.17.2
0.17.1
0.17.0
0.16.4
0.16.3
0.16.2
0.16.1
0.16.0
0.15.5
0.15.4
0.15.3
0.15.2
0.15.1
0.15.0
0.14.7
0.14.6
0.14.5
0.14.4
0.14.3
0.14.2
0.14.1
0.14.0
0.14.0-rc.1
0.14.0-rc.0
0.13.3
0.13.2
0.13.1
0.13.0
0.12.1
0.12.0
0.11.4
0.11.3
0.11.2
0.11.1
0.11.0
0.10.0
0.9.3
0.9.2
0.9.1
0.9.0
0.8.2
0.8.1
0.8.0
0.7.2
0.7.1
0.7.0
0.6.3
0.6.2
0.6.1
0.6.0
0.5.2
0.5.1
0.5.0
0.4.1
0.4.0
0.3.2
0.3.1
0.3.0
0.2.3
0.2.2
0.2.1
0.2.0
0.1.2
0.1.1
0.1.0
Automate code & data workflows with interactive notebooks
Current section
Files
Jump to
Current section
Files
lib/livebook/text/selection.ex
defmodule Livebook.Text.Selection do
# A text selection holding one or more selection ranges.
#
# This is a minimal representation of an editor selection, specifically
# for the purpose of serialization and transformation. It does not
# perform any normalizations, such as deduplication and range merging,
# since this is already handled on the client during deserialization.
defstruct [:ranges]
@type t :: %__MODULE__{ranges: list(range())}
@type range :: {anchor :: non_neg_integer(), head :: non_neg_integer()}
def new(ranges) do
if ranges == [] do
raise ArgumentError, "text selection must have at least a single range"
end
%__MODULE__{ranges: ranges}
end
@doc """
Transforms `selection` against `delta`.
Selections are ultimately a group of positions, so each position is
transformed. See `Livebook.Text.Delta.transform_position/2` for more
details.
"""
@spec transform(t(), Livebook.Text.Delta.t()) :: t()
def transform(selection, delta) do
ranges =
for {anchor, head} <- selection.ranges do
{Livebook.Text.Delta.transform_position(delta, anchor),
Livebook.Text.Delta.transform_position(delta, head)}
end
%__MODULE__{ranges: ranges}
end
@doc """
Converts the given selection to a compact representation, suitable
for JSON serialization.
"""
@spec to_compressed(t()) :: list()
def to_compressed(selection) do
for {anchor, head} <- selection.ranges, do: [anchor, head]
end
@doc """
Builds a new selection from the given compact representation.
"""
@spec from_compressed(list()) :: t()
def from_compressed(list) do
ranges = for [anchor, head] <- list, do: {anchor, head}
%__MODULE__{ranges: ranges}
end
end