Packages

spark

1.1.35
2.7.2 2.7.1 2.7.0 2.6.1 2.6.0 2.5.0 2.4.1 2.4.0 2.3.14 2.3.13 2.3.12 2.3.11 2.3.10 2.3.9 2.3.8 2.3.7 2.3.6 2.3.5 2.3.4 2.3.3 2.3.2 2.3.1 2.3.0 2.2.69 2.2.68 2.2.67 2.2.66 2.2.65 2.2.64 2.2.63 2.2.62 2.2.61 2.2.60 2.2.59 2.2.58 2.2.57 2.2.56 2.2.55 2.2.54 2.2.53 2.2.52 2.2.51 2.2.50 2.2.49 2.2.48 2.2.47 2.2.46 2.2.45 2.2.44 2.2.43 2.2.42 2.2.41 2.2.40 2.2.39 2.2.38 2.2.37 2.2.36 2.2.35 2.2.34 2.2.33 2.2.32 2.2.31 2.2.30 2.2.29 2.2.28 2.2.27 2.2.26 2.2.25 2.2.24 2.2.23 2.2.22 2.2.21 2.2.20 2.2.19 2.2.18 2.2.17 2.2.16 2.2.15 2.2.14 2.2.13 2.2.12 2.2.11 2.2.10 2.2.9 2.2.8 2.2.7 2.2.6 2.2.5 2.2.4 2.2.3 2.2.2 2.2.1 2.2.0 2.1.24 2.1.23 2.1.22 2.1.21 2.1.20 2.1.19 2.1.18 2.1.17 2.1.16 2.1.15 2.1.14 2.1.13 2.1.12 2.1.11 2.1.10 2.1.9 2.1.8 2.1.7 2.1.6 2.1.5 2.1.4 2.1.3 2.1.2 2.1.1 2.1.0 2.0.1 2.0.0 1.1.55 1.1.54 1.1.53 1.1.52 1.1.51 1.1.50 1.1.49 1.1.48 1.1.47 1.1.46 1.1.45 1.1.44 1.1.43 1.1.42 1.1.41 1.1.40 1.1.39 1.1.38 1.1.37 1.1.36 1.1.35 1.1.34 1.1.32 1.1.31 1.1.30 1.1.29 1.1.28 1.1.27 1.1.26 1.1.25 1.1.24 1.1.22 1.1.21 1.1.20 1.1.19 1.1.18 1.1.17 1.1.16 1.1.15 1.1.14 retired 1.1.13 1.1.12 1.1.11 1.1.10 1.1.9 1.1.8 1.1.7 1.1.6 1.1.5 1.1.4 1.1.3 1.1.2 1.1.1 1.1.0 1.0.9 1.0.8 1.0.7 1.0.6 1.0.5 1.0.4 1.0.3 1.0.2 1.0.1 1.0.0 0.4.12 0.4.11 0.4.10 0.4.9 0.4.8 0.4.7 0.4.6 0.4.5 0.4.4 0.4.3 0.4.2 0.4.1 0.3.12 0.3.11 0.3.10 0.3.9 0.3.8 0.3.7 0.3.6 0.3.5 0.3.4 0.3.3 0.3.2 0.3.1 0.3.0 0.2.18 0.2.17 0.2.16 0.2.15 0.2.14 0.2.13 0.2.12 0.2.11 0.2.10 0.2.9 0.2.8 0.2.7 0.2.6 0.2.5 0.2.4 0.2.3 0.2.2 0.2.1 0.2.0 0.1.29 0.1.28 0.1.27 0.1.26 0.1.25 0.1.24 0.1.23 0.1.22 0.1.21 0.1.20 0.1.19 0.1.18 0.1.17 0.1.16 0.1.15 0.1.14 0.1.13 0.1.12 0.1.11 0.1.10 0.1.9 0.1.8 0.1.7 0.1.6 0.1.5 0.1.4 0.1.3 0.1.2 0.1.1 0.1.0

Generic tooling for building DSLs

Current section

Files

Jump to
spark lib spark types.ex
Raw

lib/spark/types.ex

defmodule Spark.Types do
@moduledoc "Helpers for spark types"
def doc_type({:behaviour, _mod}), do: "module"
def doc_type({:spark, mod}), do: doc_type({:behaviour, mod})
def doc_type({:spark_behaviour, mod}), do: doc_type({:behaviour, mod})
def doc_type({:spark_behaviour, mod, _builtins}), do: doc_type({:behaviour, inspect(mod)})
def doc_type(:module), do: "module"
def doc_type({:spark_function_behaviour, mod, {_, arity}}) do
doc_type({:or, [{:fun, arity}, {:spark_behaviour, mod}]})
end
def doc_type({:spark_function_behaviour, mod, _builtins, {_, arity}}) do
doc_type({:or, [{:fun, arity}, {:spark_behaviour, mod}]})
end
def doc_type({:custom, _, _, _}), do: "`any`"
def doc_type(:any), do: "`any`"
def doc_type(:keyword_list), do: "Keyword.t"
def doc_type({:keyword_list, schema}) do
options = Enum.map(schema, fn {key, value} -> {key, value[:type]} end)
"#{doc_type({:or, options})}"
end
def doc_type(:non_empty_keyword_list), do: "Keyword.t"
def doc_type(:atom), do: "atom"
def doc_type(:string), do: "String.t"
def doc_type(:boolean), do: "boolean"
def doc_type(:integer), do: "integer"
def doc_type(:non_neg_integer), do: "non_neg_integer"
def doc_type(:pos_integer), do: "pos_integer"
def doc_type(:float), do: "float"
def doc_type(:timeout), do: "timeout"
def doc_type(:pid), do: "pid"
def doc_type(:mfa), do: "mfa"
def doc_type(:mod_arg), do: doc_type({:tuple, [:module, {:list, :any}]})
def doc_type({:tuple, list}) when is_list(list) do
tuple = Enum.map_join(list, ", ", &doc_type/1)
"{#{tuple}}"
end
def doc_type(:map), do: "map"
def doc_type(:struct), do: "struct"
def doc_type({:struct, struct}), do: "#{inspect(struct)}"
def doc_type(nil), do: "nil"
def doc_type({:fun, 0}), do: "(-> any)"
def doc_type({:fun, arity}) when is_integer(arity) do
args =
Enum.map_join(0..(arity - 1), ", ", fn _ -> "any" end)
"(#{args} -> any)"
end
def doc_type({:fun, args}) when is_list(args) do
args =
Enum.map_join(args, ", ", &doc_type/1)
"(#{args} -> any)"
end
def doc_type({:fun, args, return}) when is_list(args) do
args =
Enum.map_join(args, ", ", &doc_type/1)
"(#{args} -> #{doc_type(return)})"
end
def doc_type({:one_of, choices}), do: doc_type({:in, choices})
def doc_type({:in, choices}), do: Enum.map_join(choices, " | ", &inspect/1)
def doc_type({:or, subtypes}), do: Enum.map_join(subtypes, " | ", &doc_type/1)
def doc_type({:list, subtype}), do: "list(#{doc_type(subtype)})"
def doc_type({:wrap_list, subtype}) do
str = doc_type(subtype)
"list(#{str}) | #{str}"
end
def doc_type({:list_of, subtype}), do: doc_type({:list, subtype})
def doc_type({:mfa_or_fun, arity}), do: doc_type({:or, [{:fun, arity}, :mfa]})
def doc_type(:literal), do: "any()"
def doc_type({:literal, value}), do: inspect(value)
def doc_type({:tagged_tuple, tag, type}), do: doc_type({:tuple, [{:literal, tag}, type]})
def doc_type({:spark_type, type, _}), do: doc_type({:behaviour, type})
def doc_type({:spark_type, type, _, _}), do: doc_type({:behaviour, type})
end