diff --git a/.tool-versions b/.tool-versions new file mode 100644 index 0000000..d5fb44a --- /dev/null +++ b/.tool-versions @@ -0,0 +1,2 @@ +erlang 22.0.5 +elixir 1.9.4 diff --git a/lib/algae/free.ex b/lib/algae/free.ex index 03bfc77..6a18a23 100644 --- a/lib/algae/free.ex +++ b/lib/algae/free.ex @@ -32,13 +32,16 @@ defmodule Algae.Free do """ - alias Alage.Free.{Pure, Roll} + alias __MODULE__ + alias Algae.Free.{Pure, Roll} + import Algae - use Witchcraft + + use Witchcraft defsum do - defdata Roll :: any() # Witchcraft.Functor.t() - defdata Pure :: any() \\ %Witchcraft.Unit{} + defdata(Roll :: any()) + defdata(Pure :: any() \\ %Witchcraft.Unit{}) end @doc """ @@ -111,3 +114,178 @@ defmodule Algae.Free do |> wrap() end end + +alias Algae.Free +alias Algae.Free.{Pure, Roll} +alias TypeClass.Property.Generator +alias Witchcraft.{Apply, Chain, Functor, Ord, Setoid} +import TypeClass +use Witchcraft + +############# +# Generator # +############# + +defimpl TypeClass.Property.Generator, for: Algae.Free.Pure do + def generate(_) do + [1, 1.1, "", []] + |> Enum.random() + |> Generator.generate() + |> Pure.new() + end +end + +defimpl TypeClass.Property.Generator, for: Algae.Free.Roll do + def generate(_) do + inner = Algae.Id.new() + + seed = + [1, 1.1, "", []] + |> Enum.random() + |> Generator.generate() + + seed + |> Free.new() + |> Free.layer(inner) + |> Free.layer(inner) + end +end + +########## +# Setoid # +########## + +definst Witchcraft.Setoid, for: Algae.Free.Pure do + custom_generator(_) do + 1 + |> Generator.generate() + |> Pure.new() + end + + def equivalent?(_, %Roll{}), do: false + def equivalent?(%Pure{pure: a}, %Pure{pure: b}), do: Setoid.equivalent?(a, b) +end + +definst Witchcraft.Setoid, for: Algae.Free.Roll do + custom_generator(_) do + inner = Algae.Id.new() + seed = Generator.generate(1) + + seed + |> Free.new() + |> Free.layer(inner) + |> Free.layer(inner) + end + + def equivalent?(_, %Pure{}), do: false + def equivalent?(%Roll{roll: a}, %Roll{roll: b}), do: Setoid.equivalent?(a, b) +end + +####### +# Ord # +####### + +definst Witchcraft.Ord, for: Algae.Free.Pure do + custom_generator(_) do + 1 + |> TypeClass.Property.Generator.generate() + |> Free.new() + end + + def compare(_, %Roll{}), do: :lesser + def compare(%Pure{pure: a}, %Pure{pure: b}), do: Ord.compare(a, b) +end + +definst Witchcraft.Ord, for: Algae.Free.Roll do + custom_generator(_) do + inner = Algae.Id.new() + seed = Generator.generate(1) + + seed + |> Free.new() + |> Free.layer(inner) + |> Free.layer(inner) + end + + def compare(%Roll{}, %Pure{}), do: :greater + def compare(%Roll{roll: a}, %Roll{roll: b}), do: Ord.compare(a, b) +end + +########### +# Functor # +########### + +definst Witchcraft.Functor, for: Algae.Free.Pure do + def map(%Pure{pure: data}, fun), do: %Pure{pure: fun.(data)} +end + +definst Witchcraft.Functor, for: Algae.Free.Roll do + def map(%Roll{roll: data}, fun) do + data + |> Functor.map(&Functor.map(&1, fun)) + |> Roll.new() + end +end + +######### +# Apply # +######### + +definst Witchcraft.Apply, for: Algae.Free.Pure do + def convey(%Pure{pure: data}, %Pure{pure: fun}), do: %Pure{pure: fun.(data)} + + def convey(pure, %Roll{roll: rolled}) do + rolled + |> Functor.map(&Apply.convey(pure, &1)) + |> Roll.new() + end +end + +definst Witchcraft.Apply, for: Algae.Free.Roll do + def convey(%Roll{roll: rolled}, %Pure{pure: fun}) do + rolled + |> Functor.map(&Functor.map(&1, fun)) + |> Roll.new() + end + + def convey(roll, %Roll{roll: rolled}) do + rolled + |> Functor.map(&Apply.convey(roll, &1)) + |> Roll.new() + end +end + +############### +# Applicative # +############### + +definst Witchcraft.Applicative, for: Algae.Free.Pure do + def of(_, value), do: %Pure{pure: value} +end + +definst Witchcraft.Applicative, for: Algae.Free.Roll do + def of(_, value), do: %Pure{pure: value} +end + +######### +# Chain # +######### + +definst Witchcraft.Chain, for: Algae.Free.Pure do + def chain(%Pure{pure: pure}, link), do: link.(pure) +end + +definst Witchcraft.Chain, for: Algae.Free.Roll do + def chain(%Roll{roll: rolled}, link) do + rolled + |> Functor.map(&Chain.chain(&1, link)) + |> Roll.new() + end +end + +######### +# Monad # +######### + +definst(Witchcraft.Monad, for: Algae.Free.Pure) +definst(Witchcraft.Monad, for: Algae.Free.Roll) diff --git a/lib/algae/free/applicative.ex b/lib/algae/free/applicative.ex deleted file mode 100644 index 67ffdee..0000000 --- a/lib/algae/free/applicative.ex +++ /dev/null @@ -1,10 +0,0 @@ -alias Algae.Free.Pure -import TypeClass - -definst Witchcraft.Applicative, for: Algae.Free.Pure do - def of(_, value), do: %Pure{pure: value} -end - -definst Witchcraft.Applicative, for: Algae.Free.Roll do - def of(_, value), do: %Pure{pure: value} -end diff --git a/lib/algae/free/apply.ex b/lib/algae/free/apply.ex deleted file mode 100644 index 5383156..0000000 --- a/lib/algae/free/apply.ex +++ /dev/null @@ -1,28 +0,0 @@ -alias Algae.Free.{Pure, Roll} -alias Witchcraft.{Functor, Apply} - -import TypeClass - -definst Witchcraft.Apply, for: Algae.Free.Pure do - def convey(%Pure{pure: data}, %Pure{pure: fun}), do: %Pure{pure: fun.(data)} - - def convey(pure, %Roll{roll: rolled}) do - rolled - |> Functor.map(&Apply.convey(pure, &1)) - |> Roll.new() - end -end - -definst Witchcraft.Apply, for: Algae.Free.Roll do - def convey(%Roll{roll: rolled}, %Pure{pure: fun}) do - rolled - |> Functor.map(&Functor.map(&1, fun)) - |> Roll.new() - end - - def convey(roll, %Roll{roll: rolled}) do - rolled - |> Functor.map(&Apply.convey(roll, &1)) - |> Roll.new() - end -end diff --git a/lib/algae/free/chain.ex b/lib/algae/free/chain.ex deleted file mode 100644 index 72bda21..0000000 --- a/lib/algae/free/chain.ex +++ /dev/null @@ -1,16 +0,0 @@ -alias Algae.Free.{Pure, Roll} -alias Witchcraft.{Functor, Chain} - -import TypeClass - -definst Witchcraft.Chain, for: Algae.Free.Pure do - def chain(%Pure{pure: pure}, link), do: link.(pure) -end - -definst Witchcraft.Chain, for: Algae.Free.Roll do - def chain(%Roll{roll: rolled}, link) do - rolled - |> Functor.map(&Chain.chain(&1, link)) - |> Roll.new() - end -end diff --git a/lib/algae/free/functor.ex b/lib/algae/free/functor.ex deleted file mode 100644 index ae21059..0000000 --- a/lib/algae/free/functor.ex +++ /dev/null @@ -1,16 +0,0 @@ -alias Algae.Free.{Pure, Roll} -alias Witchcraft.Functor - -import TypeClass - -definst Witchcraft.Functor, for: Algae.Free.Pure do - def map(%Pure{pure: data}, fun), do: %Pure{pure: fun.(data)} -end - -definst Witchcraft.Functor, for: Algae.Free.Roll do - def map(%Roll{roll: data}, fun) do - data - |> Functor.map(&Functor.map(&1, fun)) - |> Roll.new() - end -end diff --git a/lib/algae/free/generator.ex b/lib/algae/free/generator.ex deleted file mode 100644 index 6ad391e..0000000 --- a/lib/algae/free/generator.ex +++ /dev/null @@ -1,29 +0,0 @@ -alias Algae.Free.Pure -alias TypeClass.Property.Generator - -import Algae.Free - -defimpl TypeClass.Property.Generator, for: Algae.Free.Pure do - def generate(_) do - [1, 1.1, "", []] - |> Enum.random() - |> Generator.generate() - |> Pure.new() - end -end - -defimpl TypeClass.Property.Generator, for: Algae.Free.Roll do - def generate(_) do - inner = Algae.Id.new() - - seed = - [1, 1.1, "", []] - |> Enum.random() - |> Generator.generate() - - seed - |> new() - |> layer(inner) - |> layer(inner) - end -end diff --git a/lib/algae/free/monad.ex b/lib/algae/free/monad.ex deleted file mode 100644 index bc16279..0000000 --- a/lib/algae/free/monad.ex +++ /dev/null @@ -1,4 +0,0 @@ -import TypeClass - -definst Witchcraft.Monad, for: Algae.Free.Pure -definst Witchcraft.Monad, for: Algae.Free.Roll diff --git a/lib/algae/free/ord.ex b/lib/algae/free/ord.ex deleted file mode 100644 index a615e63..0000000 --- a/lib/algae/free/ord.ex +++ /dev/null @@ -1,32 +0,0 @@ -alias Algae.Free.{Pure, Roll} -alias Witchcraft.Ord -alias TypeClass.Property.Generator - -import Algae.Free -import TypeClass - -definst Witchcraft.Ord, for: Algae.Free.Pure do - custom_generator(_) do - 1 - |> TypeClass.Property.Generator.generate() - |> Algae.Free.new() - end - - def compare(_, %Roll{}), do: :lesser - def compare(%Pure{pure: a}, %Pure{pure: b}), do: Ord.compare(a, b) -end - -definst Witchcraft.Ord, for: Algae.Free.Roll do - custom_generator(_) do - inner = Algae.Id.new() - seed = Generator.generate(1) - - seed - |> new() - |> layer(inner) - |> layer(inner) - end - - def compare(%Roll{}, %Pure{}), do: :greater - def compare(%Roll{roll: a}, %Roll{roll: b}), do: Ord.compare(a, b) -end diff --git a/lib/algae/free/setoid.ex b/lib/algae/free/setoid.ex deleted file mode 100644 index f2ffe0f..0000000 --- a/lib/algae/free/setoid.ex +++ /dev/null @@ -1,32 +0,0 @@ -alias Algae.Free.{Pure, Roll} -alias Witchcraft.Setoid -alias TypeClass.Property.Generator - -import Algae.Free -import TypeClass - -definst Witchcraft.Setoid, for: Algae.Free.Pure do - custom_generator(_) do - 1 - |> Generator.generate() - |> Pure.new() - end - - def equivalent?(_, %Roll{}), do: false - def equivalent?(%Pure{pure: a}, %Pure{pure: b}), do: Setoid.equivalent?(a, b) -end - -definst Witchcraft.Setoid, for: Algae.Free.Roll do - custom_generator(_) do - inner = Algae.Id.new() - seed = Generator.generate(1) - - seed - |> new() - |> layer(inner) - |> layer(inner) - end - - def equivalent?(_, %Pure{}), do: false - def equivalent?(%Roll{roll: a}, %Roll{roll: b}), do: Setoid.equivalent?(a, b) -end diff --git a/lib/algae/tree/binary_search.ex b/lib/algae/tree/binary_search.ex index a163b2d..7bdd62b 100644 --- a/lib/algae/tree/binary_search.ex +++ b/lib/algae/tree/binary_search.ex @@ -40,16 +40,18 @@ defmodule Algae.Tree.BinarySearch do """ alias __MODULE__ + alias BinarySearch.{Empty, Node} + import Algae use Witchcraft, except: [to_list: 1] defsum do - defdata Empty :: none() + defdata(Empty :: none()) defdata Node do node :: any() - left :: BinarySearch.t() \\ Empty.new() - right :: BinarySearch.t() \\ Empty.new() + left :: BinarySearch.t() \\ BinarySearch.Empty.new() + right :: BinarySearch.t() \\ BinarySearch.Empty.new() end end @@ -97,20 +99,22 @@ defmodule Algae.Tree.BinarySearch do """ @spec insert(t(), any()) :: t() def insert(%Empty{}, value), do: new(value) + def insert(tree = %Node{node: node, left: left, right: right}, orderable) do case compare(orderable, node) do - :equal -> tree + :equal -> tree :greater -> %{tree | right: insert(right, orderable)} - :lesser -> %{tree | left: insert(left, orderable)} + :lesser -> %{tree | left: insert(left, orderable)} end end def insert(%Empty{}, value), do: new(value) + def insert(tree = %Node{node: node, left: left, right: right}, orderable) do case compare(orderable, node) do - :equal -> tree + :equal -> tree :greater -> %{tree | right: insert(right, orderable)} - :lesser -> %{tree | left: insert(left, orderable)} + :lesser -> %{tree | left: insert(left, orderable)} end end @@ -146,18 +150,19 @@ defmodule Algae.Tree.BinarySearch do """ @spec delete(t(), any()) :: t() def delete(%Empty{}, _), do: %Empty{} + def delete(tree = %Node{node: node, left: left, right: right}, orderable) do case compare(orderable, node) do :greater -> %{tree | right: delete(right, orderable)} :lesser -> - %{tree | left: delete(left, orderable)} + %{tree | left: delete(left, orderable)} :equal -> case tree do - %{left: %Empty{}} -> right - %{right: %Empty{}} -> left + %{left: %Empty{}} -> right + %{right: %Empty{}} -> left %{right: %{node: shift}} -> %{tree | node: shift, right: delete(right, shift)} end end @@ -233,7 +238,7 @@ defmodule Algae.Tree.BinarySearch do """ @spec from_list(list()) :: t() - def from_list([]), do: %Empty{} + def from_list([]), do: %Empty{} def from_list([head | tail]), do: from_list(tail, new(head)) @doc """ @@ -264,7 +269,6 @@ defmodule Algae.Tree.BinarySearch do """ @spec from_list(list(), t()) :: t() - def from_list([], seed), do: seed + def from_list([], seed), do: seed def from_list([head | tail], seed), do: from_list(tail, insert(seed, head)) - end diff --git a/lib/algae/tree/binary_search/applicative.ex b/lib/algae/tree/binary_search/applicative.ex index b2a4e16..fdba0a6 100644 --- a/lib/algae/tree/binary_search/applicative.ex +++ b/lib/algae/tree/binary_search/applicative.ex @@ -1,6 +1,6 @@ -alias Algae.Tree.BinarySearch.Node +alias Algae.Tree.BinarySearch.Node import TypeClass -use Witchcraft +use Witchcraft definst Witchcraft.Applicative, for: Algae.Tree.BinarySearch.Empty do def of(_, data), do: %Node{node: data} diff --git a/lib/algae/tree/binary_search/monad.ex b/lib/algae/tree/binary_search/monad.ex index f152131..22ef183 100644 --- a/lib/algae/tree/binary_search/monad.ex +++ b/lib/algae/tree/binary_search/monad.ex @@ -1,7 +1,7 @@ import TypeClass use Witchcraft -definst Witchcraft.Monad, for: Algae.Tree.BinarySearch.Empty +definst(Witchcraft.Monad, for: Algae.Tree.BinarySearch.Empty) definst Witchcraft.Monad, for: Algae.Tree.BinarySearch.Node do @force_type_instance true diff --git a/lib/algae/tree/binary_search/semigroup.ex b/lib/algae/tree/binary_search/semigroup.ex index 754bf99..766b36d 100644 --- a/lib/algae/tree/binary_search/semigroup.ex +++ b/lib/algae/tree/binary_search/semigroup.ex @@ -5,12 +5,13 @@ import TypeClass use Witchcraft definst Witchcraft.Semigroup, for: Algae.Tree.BinarySearch.Empty do - def append(_, %Empty{}), do: %Empty{} + def append(_, %Empty{}), do: %Empty{} def append(_, node = %Node{}), do: node end definst Witchcraft.Semigroup, for: Algae.Tree.BinarySearch.Node do def append(node, %Empty{}), do: node + def append(node_a, node_b) do node_a |> BST.to_list() diff --git a/mix.exs b/mix.exs index 9888ad8..3f92795 100644 --- a/mix.exs +++ b/mix.exs @@ -2,45 +2,58 @@ defmodule Algae.Mixfile do use Mix.Project def project do - [app: :algae, - name: "Algae", - - description: "Bootstrapped algebraic data types for Elixir", - version: "1.2.3", - elixir: "~> 1.7", - - package: [ - maintainers: ["Brooklyn Zelenka"], - licenses: ["MIT"], - links: %{"GitHub" => "https://github.com/expede/algae"} - ], - - source_url: "https://github.com/expede/algae", - homepage_url: "https://github.com/expede/algae", - - aliases: [ - quality: ["test", "credo --strict"] - ], - - deps: [ - {:credo, "~> 1.0", only: [:dev, :test]}, + [ + app: :algae, + aliases: aliases(), + deps: deps(), + + # Versions + version: "1.2.4", + elixir: "~> 1.9", + + # Docs + name: "Algae", + docs: docs(), + + # Hex + description: "Bootstrapped algebraic data types for Elixir", + package: package() + ] + end - {:dialyxir, "~> 0.5", only: :dev}, - {:earmark, "~> 1.2", only: :dev}, - {:ex_doc, "~> 0.16", only: :dev}, + defp aliases do + [ + quality: ["test", "credo --strict"] + ] + end - {:inch_ex, "~> 2.0", only: [:dev, :docs, :test]}, + defp deps do + [ + {:credo, "~> 1.1", only: [:dev, :test]}, + {:dialyxir, "~> 0.5", only: :dev}, + {:earmark, "~> 1.4.0", only: :dev}, + {:ex_doc, "~> 0.21.2", only: :dev}, + {:inch_ex, "~> 2.0", only: [:dev, :docs, :test]}, + {:quark, "~> 2.3"}, + {:type_class, "~> 1.2"}, + {:witchcraft, "~> 1.0"} + ] + end - {:quark, "~> 2.3"}, - {:type_class, "~> 1.2"}, - {:witchcraft, "~> 1.0"} - ], + defp docs do + [ + extras: ["README.md"], + logo: "./brand/mini-logo.png", + main: "readme", + source_url: "https://github.com/witchcrafters/algae" + ] + end - docs: [ - extras: ["README.md"], - logo: "./brand/mini-logo.png", - main: "readme" - ] + defp package do + [ + licenses: ["MIT"], + links: %{"GitHub" => "https://github.com/witchcrafters/algae"}, + maintainers: ["Brooklyn Zelenka", "Steven Vandevelde"] ] end end diff --git a/mix.lock b/mix.lock index 33a1140..c0a867c 100644 --- a/mix.lock +++ b/mix.lock @@ -1,15 +1,15 @@ %{ "bunt": {:hex, :bunt, "0.2.0", "951c6e801e8b1d2cbe58ebbd3e616a869061ddadcc4863d0a2182541acae9a38", [:mix], [], "hexpm"}, - "credo": {:hex, :credo, "1.0.2", "88bc918f215168bf6ce7070610a6173c45c82f32baa08bdfc80bf58df2d103b6", [:mix], [{:bunt, "~> 0.2.0", [hex: :bunt, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm"}, + "credo": {:hex, :credo, "1.1.4", "c2f3b73c895d81d859cec7fcee7ffdb972c595fd8e85ab6f8c2adbf01cf7c29c", [:mix], [{:bunt, "~> 0.2.0", [hex: :bunt, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm"}, "dialyxir": {:hex, :dialyxir, "0.5.1", "b331b091720fd93e878137add264bac4f644e1ddae07a70bf7062c7862c4b952", [:mix], [], "hexpm"}, - "earmark": {:hex, :earmark, "1.3.1", "73812f447f7a42358d3ba79283cfa3075a7580a3a2ed457616d6517ac3738cb9", [:mix], [], "hexpm"}, - "ex_doc": {:hex, :ex_doc, "0.19.3", "3c7b0f02851f5fc13b040e8e925051452e41248f685e40250d7e40b07b9f8c10", [:mix], [{:earmark, "~> 1.2", [hex: :earmark, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.10", [hex: :makeup_elixir, repo: "hexpm", optional: false]}], "hexpm"}, - "exceptional": {:hex, :exceptional, "2.1.0", "b3bc6c7041a242df9f7e18223649f3d66633827897138cf5f26c46c88b6925ae", [:mix], [], "hexpm"}, + "earmark": {:hex, :earmark, "1.4.0", "397e750b879df18198afc66505ca87ecf6a96645545585899f6185178433cc09", [:mix], [], "hexpm"}, + "ex_doc": {:hex, :ex_doc, "0.21.2", "caca5bc28ed7b3bdc0b662f8afe2bee1eedb5c3cf7b322feeeb7c6ebbde089d6", [:mix], [{:earmark, "~> 1.3.3 or ~> 1.4", [hex: :earmark, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}], "hexpm"}, + "exceptional": {:hex, :exceptional, "2.1.1", "f18f8c1be63aab7fe8f3000cf2a8678936544fc39af1e2bc4a5c3c9e38cd8899", [:mix], [], "hexpm"}, "inch_ex": {:hex, :inch_ex, "2.0.0", "24268a9284a1751f2ceda569cd978e1fa394c977c45c331bb52a405de544f4de", [:mix], [{:bunt, "~> 0.2", [hex: :bunt, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm"}, "jason": {:hex, :jason, "1.1.2", "b03dedea67a99223a2eaf9f1264ce37154564de899fd3d8b9a21b1a6fd64afe7", [:mix], [{:decimal, "~> 1.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm"}, - "makeup": {:hex, :makeup, "0.8.0", "9cf32aea71c7fe0a4b2e9246c2c4978f9070257e5c9ce6d4a28ec450a839b55f", [:mix], [{:nimble_parsec, "~> 0.5.0", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm"}, - "makeup_elixir": {:hex, :makeup_elixir, "0.13.0", "be7a477997dcac2e48a9d695ec730b2d22418292675c75aa2d34ba0909dcdeda", [:mix], [{:makeup, "~> 0.8", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm"}, - "nimble_parsec": {:hex, :nimble_parsec, "0.5.0", "90e2eca3d0266e5c53f8fbe0079694740b9c91b6747f2b7e3c5d21966bba8300", [:mix], [], "hexpm"}, + "makeup": {:hex, :makeup, "1.0.0", "671df94cf5a594b739ce03b0d0316aa64312cee2574b6a44becb83cd90fb05dc", [:mix], [{:nimble_parsec, "~> 0.5.0", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm"}, + "makeup_elixir": {:hex, :makeup_elixir, "0.14.0", "cf8b7c66ad1cff4c14679698d532f0b5d45a3968ffbcbfd590339cb57742f1ae", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm"}, + "nimble_parsec": {:hex, :nimble_parsec, "0.5.1", "c90796ecee0289dbb5ad16d3ad06f957b0cd1199769641c961cfe0b97db190e0", [:mix], [], "hexpm"}, "operator": {:hex, :operator, "0.2.0", "b613bdb520a20dbc016d921d444fd2ef2212136be9385d6dca448a2a38d0577f", [:mix], [], "hexpm"}, "poison": {:hex, :poison, "3.1.0", "d9eb636610e096f86f25d9a46f35a9facac35609a7591b3be3326e99a0484665", [:mix], [], "hexpm"}, "quark": {:hex, :quark, "2.3.0", "3742ddc14441b4930c7067741879cb5b3e4881f391ea0aed7b138f20d16b30bb", [:mix], [], "hexpm"},