Packages

Provides random words from a list of 5,000 most common American English words. Can break them down into parts-of-speech. Fun for party tricks, example strings, and random names.

Current section

Files

Jump to
random_words lib random_words.ex
Raw

lib/random_words.ex

defmodule RandomWords do
@moduledoc """
Provide a random word from a list of 5,000 most common American English words.
"""
NimbleCSV.define(MyParser, separator: ",", escape: "\"")
def words(number, _opts \\ []) do
Enum.map(1..number, fn _ -> word() end)
end
def word(opts) do
opts
|> wordlist()
|> get_random()
end
def word do
data() |> get_random()
end
@doc """
Excludes numerals, determiners, and adjuncts. (See any_adjective/0)
"""
def adjective, do: word(part_of_speech: "adjective")
def adjunct, do: word(part_of_speech: "adjunct")
@doc """
Excludes conjunctive adverbs. (See any_adverb/0)
"""
def adverb, do: word(part_of_speech: "adverb")
def conjunctive_adverb, do: word(part_of_speech: "conjunctive_adverb")
def determiner, do: word(part_of_speech: "determiner")
def interjection, do: word(part_of_speech: "interjection")
def noun, do: word(part_of_speech: "noun")
def numeral, do: word(part_of_speech: "numeral")
def preposition, do: word(part_of_speech: "preposition")
def pronoun, do: word(part_of_speech: "pronoun")
def verb, do: word(part_of_speech: "verb")
@doc """
Includes numerals, determiners, and adjuncts.
"""
def any_adjective, do: word(part_of_speech: "any_adjective")
@doc """
Includes conjunctive adverbs.
"""
def any_adverb, do: word(part_of_speech: "any_adverb")
def wordlist, do: data()
def wordlist(part_of_speech: "any_adjective") do
speech = parts_of_speech()
speech["adjective"] ++
speech["determiner"] ++
speech["numeral"] ++ speech["adjunct"]
end
def wordlist(part_of_speech: "any_adverb") do
speech = parts_of_speech()
speech["adverb"] ++ speech["conjunctive_adverb"]
end
def wordlist(part_of_speech: part), do: parts_of_speech()[part]
# Private Functions #
defp start_server do
case RandomWords.WordServer in Process.registered() do
false ->
RandomWords.WordSupervisor.start_link()
true ->
nil
end
end
defp get_random(list) do
list
|> Enum.random()
|> case do
map when is_map(map) -> map[:word]
word -> word
end
end
defp data do
start_server()
GenServer.call(RandomWords.WordServer, :words)
end
defp parts_of_speech do
start_server()
GenServer.call(RandomWords.WordServer, :parts_of_speech)
end
end