-module(tobble@internal@builder). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]). -export([new/0, from_list/1, from_error/1, to_result/1, add_row/2]). -export_type([builder/0, builder_internals/0, builder_error/0]). -opaque builder() :: {builder, builder_internals()} | {failed_builder, builder_error()}. -type builder_internals() :: {builder_internals, list(list(binary()))}. -type builder_error() :: {inconsistent_column_count_error, integer(), integer()} | empty_table_error. -file("/home/nick/Documents/code/tobble/src/tobble/internal/builder.gleam", 26). -spec new() -> builder(). new() -> {builder, {builder_internals, []}}. -file("/home/nick/Documents/code/tobble/src/tobble/internal/builder.gleam", 56). -spec from_list(list(list(binary()))) -> builder(). from_list(Rows) -> {builder, {builder_internals, lists:reverse(Rows)}}. -file("/home/nick/Documents/code/tobble/src/tobble/internal/builder.gleam", 61). -spec from_error(builder_error()) -> builder(). from_error(Error) -> {failed_builder, Error}. -file("/home/nick/Documents/code/tobble/src/tobble/internal/builder.gleam", 79). -spec finish_build_step({ok, builder_internals()} | {error, builder_error()}) -> builder(). finish_build_step(Build_result) -> case Build_result of {ok, Internals} -> {builder, Internals}; {error, Error} -> {failed_builder, Error} end. -file("/home/nick/Documents/code/tobble/src/tobble/internal/builder.gleam", 65). -spec build_on( builder(), fun((builder_internals()) -> {ok, builder_internals()} | {error, builder_error()}) ) -> builder(). build_on(Builder, Build) -> case Builder of {builder, Internals} -> _pipe = Internals, _pipe@1 = Build(_pipe), finish_build_step(_pipe@1); {failed_builder, _} -> Builder end. -file("/home/nick/Documents/code/tobble/src/tobble/internal/builder.gleam", 86). -spec ensure_nonempty(builder()) -> builder(). ensure_nonempty(Builder) -> build_on(Builder, fun(Internals) -> case erlang:element(2, Internals) of [] -> {error, empty_table_error}; _ -> {ok, Internals} end end). -file("/home/nick/Documents/code/tobble/src/tobble/internal/builder.gleam", 38). -spec to_result(builder()) -> {ok, tobble@internal@rows:rows(binary())} | {error, builder_error()}. to_result(Builder) -> case ensure_nonempty(Builder) of {builder, Internals} -> _pipe = erlang:element(2, Internals), _pipe@1 = lists:reverse(_pipe), _pipe@2 = tobble@internal@rows:from_lists(_pipe@1), gleam@result:map_error(_pipe@2, fun(Err) -> case Err of {inconsistent_lengths_error, Expected, Got} -> {inconsistent_column_count_error, Expected, Got} end end); {failed_builder, Error} -> {error, Error} end. -file("/home/nick/Documents/code/tobble/src/tobble/internal/builder.gleam", 109). -spec last_row_column_count(builder_internals()) -> gleam@option:option(integer()). last_row_column_count(Internals) -> _pipe = erlang:element(2, Internals), _pipe@1 = gleam@list:first(_pipe), _pipe@2 = gleam@option:from_result(_pipe@1), gleam@option:map(_pipe@2, fun erlang:length/1). -file("/home/nick/Documents/code/tobble/src/tobble/internal/builder.gleam", 95). -spec validate_column_count( builder_internals(), list(binary()), fun(() -> {ok, builder_internals()} | {error, builder_error()}) ) -> {ok, builder_internals()} | {error, builder_error()}. validate_column_count(Internals, Columns, Then) -> Num_columns = erlang:length(Columns), case last_row_column_count(Internals) of none -> Then(); {some, Expected} when Expected =:= Num_columns -> Then(); {some, Expected@1} -> {error, {inconsistent_column_count_error, Expected@1, Num_columns}} end. -file("/home/nick/Documents/code/tobble/src/tobble/internal/builder.gleam", 30). -spec add_row(builder(), list(binary())) -> builder(). add_row(Builder, Columns) -> build_on( Builder, fun(Internals) -> validate_column_count( Internals, Columns, fun() -> {ok, {builder_internals, [Columns | erlang:element(2, Internals)]}} end ) end ).