Packages

plymio_codi: Generating Quoted Forms for Common Code Patterns

Current section

Files

Jump to
plymio_codi lib codi utility depend.ex
Raw

lib/codi/utility/depend.ex

defmodule Plymio.Codi.Utility.Depend do
@moduledoc false
alias Plymio.Codi, as: CODI
use Plymio.Fontais.Attribute
use Plymio.Codi.Attribute
import Plymio.Codi.CPO
@type error :: Plymio.Codi.error()
def cpo_transform_doc_depend(cpo) do
with {:ok, cpo} <- cpo |> Plymio.Codi.Pattern.Doc.cpo_pattern_doc_normalise(),
{:ok, cpo} <- cpo |> cpo_mark_status_active,
{:ok, cpo} <- cpo |> cpo_drop_form,
{:ok, cpo} <- cpo |> cpo_put_pattern(@plymio_codi_pattern_doc),
{:ok, _cpo} = result <- cpo |> cpo_tidy do
result
else
{:error, %{__exception__: true}} = result -> result
end
end
def cpo_transform_since_depend(cpo) do
with {:ok, cpo} <- cpo |> Plymio.Codi.Pattern.Other.cpo_pattern_since_normalise(),
{:ok, cpo} <- cpo |> cpo_mark_status_active,
{:ok, cpo} <- cpo |> cpo_drop_form,
{:ok, cpo} <- cpo |> cpo_put_pattern(@plymio_codi_pattern_since),
{:ok, _cpo} = result <- cpo |> cpo_tidy do
result
else
{:error, %{__exception__: true}} = result -> result
end
end
def cpo_transform_typespec_spec_depend(cpo) do
with {:ok, cpo} <- cpo |> cpo_normalise,
# delete the fun_args to stop confusion over type args;
# fun_arity will be used if needed
{:ok, cpo} <- cpo |> cpo_drop_fun_args,
{:ok, cpo} <- cpo |> Plymio.Codi.Pattern.Typespec.cpo_pattern_typespec_spec_normalise(),
{:ok, cpo} <- cpo |> cpo_mark_status_active,
{:ok, cpo} <- cpo |> cpo_drop_form,
{:ok, cpo} <- cpo |> cpo_put_pattern(@plymio_codi_pattern_typespec_spec),
{:ok, _cpo} = result <- cpo |> cpo_tidy do
result
else
{:error, %{__exception__: true}} = result -> result
end
end
def create_depend_cpos(codi, cpo, depend_args \\ [])
def create_depend_cpos(%CODI{} = state, _cpo, []) do
{:ok, {[], state}}
end
def create_depend_cpos(%CODI{} = state, cpo, depend_args)
when is_list(depend_args) do
with {:ok, cpo} <- cpo |> cpo_normalise,
{:ok, depend_args} <- depend_args |> normalise_cpo_transform_pipeline,
true <- true do
depend_args
|> List.wrap()
|> Plymio.Funcio.Enum.Map.Collate.map_collate2_enum(fn
{fun_pred, fun_transform} ->
cpo
|> fun_pred.()
|> case do
true ->
cpo |> cpo_transform(fun_transform)
# drop if the predicate was not true
_ ->
nil
end
end)
|> case do
{:error, %{__struct__: _}} = result ->
result
{:ok, depend_patterns} ->
with {:ok, %CODI{} = depend_state} <- state |> CODI.update_snippets(depend_patterns),
{:ok, {depend_product, %CODI{}}} <-
depend_state |> Plymio.Codi.Stage.Normalise.normalise_snippets(),
{:ok, depend_cpos} <- depend_product |> cpo_fetch_patterns,
true <- true do
depend_cpos
|> Enum.map(fn cpo -> cpo |> cpo_get_form(nil) |> elem(1) end)
|> Enum.reject(&is_nil/1)
{:ok, {depend_cpos, state}}
else
{:error, %{__exception__: true}} = result -> result
end
end
else
{:error, %{__exception__: true}} = result -> result
end
end
end