Current section
Files
Jump to
Current section
Files
lib/petrovich.ex
defmodule Petrovich do
@moduledoc """
Documentation for Petrovich.
Public interface to all the functions.
It can inflect first, middle, and last names.
## List of cases
Here's a quick reminder:
> nomenative: именительный
>
> genitive: родительный
>
> dative: дательный
>
> accusative: винительный
>
> instrumental: творительный
>
> prepositional: предложный
"""
use Application
alias Petrovich.Parser
def start(_type, _args) do
import Supervisor.Spec, warn: false
children = [
worker(Petrovich.NameStore, []),
worker(Petrovich.GenderStore, [])
]
opts = [strategy: :one_for_one, name: Petrovich.Supervisor]
Supervisor.start_link(children, opts)
end
@default_gender nil
@doc """
Inflects first name.
This function is used to inflect a first name.
It accepts three arguments:
1. `name` a person's first name
2. `case_` atom, one of the atoms with the case name
3. optional `gender`, since it could be detected from name
It returns `{:ok, inflected_name}` or `:error`
## Examples
iex> Petrovich.firstname("Кира", :dative)
{:ok, "Кире"}
"""
@spec firstname(String.t(), atom(), atom() | none()) ::
{:ok, String.t()} | :error
def firstname(name, case_, gender \\ @default_gender) do
Parser.parse(name, :firstname, case_, gender)
end
@doc """
The same as `firstname/3`, but raises `ParseException` on errors.
"""
@spec firstname!(String.t(), atom(), atom() | none()) :: String.t()
def firstname!(name, case_, gender \\ @default_gender) do
Parser.parse!(name, :firstname, case_, gender)
end
@doc """
Inflects middle name.
This function is used to inflect a middle name.
It accepts three arguments:
1. `name` a person's middle name
2. `case_` atom, one of the atoms with the case name
3. optional `gender`, since it could be detected from name
It returns `{:ok, inflected_name}` or `:error`
## Examples
iex> Petrovich.firstname("Викторовна", :dative)
{:ok, "Викторовне"}
"""
@spec middlename(String.t(), atom(), atom() | none()) ::
{:ok, String.t()} | :error
def middlename(name, case_, gender \\ @default_gender) do
Parser.parse(name, :middlename, case_, gender)
end
@doc """
The same as `middlename/3`, but raises `ParseException` on errors.
"""
@spec middlename!(String.t(), atom(), atom() | none()) :: String.t()
def middlename!(name, case_, gender \\ @default_gender) do
Parser.parse!(name, :middlename, case_, gender)
end
@doc """
Inflects last name.
This function is used to inflect a last name.
It accepts three arguments:
1. `name` a person's last name
2. `case_` atom, one of the atoms with the case name
3. optional `gender`, since it could be detected from name
It returns `{:ok, inflected_name}` or `:error`
## Examples
iex> Petrovich.firstname("Горева", :dative)
{:ok, "Гореве"}
"""
@spec lastname(String.t(), atom(), atom() | none()) ::
{:ok, String.t()} | :error
def lastname(name, case_, gender \\ @default_gender) do
Parser.parse(name, :lastname, case_, gender)
end
@doc """
The same as `lastname/3`, but raises `ParseException` on errors.
"""
@spec lastname!(String.t(), atom(), atom() | none()) :: String.t()
def lastname!(name, case_, gender \\ @default_gender) do
Parser.parse!(name, :lastname, case_, gender)
end
end