Packages

Pre-compiled Snowball stemmers for Elixir. Ships 36 stemming algorithms covering a wide range of natural languages, accessible through a single `Text.Stemmer.stem/2` entry point.

Current section

Files

Jump to
text_stemmer lib text stemmer stemmers english.ex
Raw

lib/text/stemmer/stemmers/english.ex

# Generated by Snowball.Generator — do not edit by hand.
defmodule Text.Stemmer.Stemmers.English do
@moduledoc """
Snowball stemmer for english.
Generated from the canonical Snowball algorithm source.
"""
alias Snowball.Runtime
alias Snowball.Grouping
# Groupings
@g_aeo Grouping.from_string("aeo")
@g_v Grouping.from_string("aeiouy")
@g_v_WXY Grouping.from_string("aeiouywxY")
@g_valid_LI Grouping.from_string("cdeghkmnrt")
# Among tables
@a_0 [
{"e", -1, 1, nil},
{"l", -1, 2, nil}
]
@a_1 [
{"ic", -1, 1, nil},
{"ance", -1, 1, nil},
{"ence", -1, 1, nil},
{"able", -1, 1, nil},
{"ible", -1, 1, nil},
{"ate", -1, 1, nil},
{"ive", -1, 1, nil},
{"ize", -1, 1, nil},
{"iti", -1, 1, nil},
{"al", -1, 1, nil},
{"ism", -1, 1, nil},
{"ion", -1, 2, nil},
{"er", -1, 1, nil},
{"ous", -1, 1, nil},
{"ant", -1, 1, nil},
{"ent", -1, 1, nil},
{"ment", 15, 1, nil},
{"ement", 16, 1, nil}
]
@a_2 [
{"icate", -1, 4, nil},
{"ative", -1, 6, nil},
{"alize", -1, 3, nil},
{"iciti", -1, 4, nil},
{"ical", -1, 4, nil},
{"tional", -1, 1, nil},
{"ational", 5, 2, nil},
{"ful", -1, 5, nil},
{"ness", -1, 5, nil}
]
@a_3 [
{"anci", -1, 3, nil},
{"enci", -1, 2, nil},
{"ogi", -1, 14, nil},
{"li", -1, 17, nil},
{"bli", 3, 12, nil},
{"abli", 4, 4, nil},
{"alli", 3, 8, nil},
{"fulli", 3, 15, nil},
{"lessli", 3, 16, nil},
{"ousli", 3, 10, nil},
{"entli", 3, 5, nil},
{"aliti", -1, 8, nil},
{"biliti", -1, 12, nil},
{"iviti", -1, 11, nil},
{"tional", -1, 1, nil},
{"ational", 14, 7, nil},
{"alism", -1, 8, nil},
{"ation", -1, 7, nil},
{"ization", 17, 6, nil},
{"izer", -1, 6, nil},
{"ator", -1, 7, nil},
{"iveness", -1, 11, nil},
{"fulness", -1, 9, nil},
{"ousness", -1, 10, nil},
{"ogist", -1, 13, nil}
]
@a_4 [
{"succ", -1, 1, nil},
{"proc", -1, 1, nil},
{"exc", -1, 1, nil}
]
@a_5 [
{"even", -1, 2, nil},
{"cann", -1, 2, nil},
{"inn", -1, 2, nil},
{"earr", -1, 2, nil},
{"herr", -1, 2, nil},
{"out", -1, 2, nil},
{"y", -1, 1, nil}
]
@a_6 [
{"", -1, -1, nil},
{"ed", 0, 2, nil},
{"eed", 1, 1, nil},
{"ing", 0, 3, nil},
{"edly", 0, 2, nil},
{"eedly", 4, 1, nil},
{"ingly", 0, 2, nil}
]
@a_7 [
{"", -1, 3, nil},
{"bb", 0, 2, nil},
{"dd", 0, 2, nil},
{"ff", 0, 2, nil},
{"gg", 0, 2, nil},
{"bl", 0, 1, nil},
{"mm", 0, 2, nil},
{"nn", 0, 2, nil},
{"pp", 0, 2, nil},
{"rr", 0, 2, nil},
{"at", 0, 1, nil},
{"tt", 0, 2, nil},
{"iz", 0, 1, nil}
]
@a_8 [
{"'", -1, 1, nil},
{"'s'", 0, 1, nil},
{"'s", -1, 1, nil}
]
@a_9 [
{"ied", -1, 2, nil},
{"s", -1, 3, nil},
{"ies", 1, 2, nil},
{"sses", 1, 1, nil},
{"ss", 1, -1, nil},
{"us", 1, -1, nil}
]
@a_10 [
{"arsen", -1, -1, nil},
{"commun", -1, -1, nil},
{"emerg", -1, -1, nil},
{"gener", -1, -1, nil},
{"inter", -1, -1, nil},
{"later", -1, -1, nil},
{"organ", -1, -1, nil},
{"past", -1, -1, nil},
{"univers", -1, -1, nil}
]
@a_11 [
{"andes", -1, -1, nil},
{"atlas", -1, -1, nil},
{"bias", -1, -1, nil},
{"cosmos", -1, -1, nil},
{"early", -1, 6, nil},
{"gently", -1, 4, nil},
{"howe", -1, -1, nil},
{"idly", -1, 3, nil},
{"news", -1, -1, nil},
{"only", -1, 7, nil},
{"singly", -1, 8, nil},
{"skies", -1, 2, nil},
{"skis", -1, 1, nil},
{"sky", -1, -1, nil},
{"ugly", -1, 5, nil}
]
@doc """
Stem a word.
### Arguments
* `word` is a UTF-8 binary.
### Returns
* The stemmed UTF-8 binary.
"""
@spec stem(binary()) :: binary()
def stem(word) when is_binary(word) do
state = Runtime.new(word) |> init_vars()
state = run_stem(state)
Runtime.assign_to(state)
end
defp init_vars(state), do: %{state | vars: %{p1: 0, p2: 0, Y_found: false}}
defp run_stem(%Runtime{} = state) do
{_, state} = r_stem(state)
state
end
# Snowball runtime helpers.
defp snowball_do_f(state, fun) do
saved_c = state.cursor
{_, s} = fun.(state)
%{s | cursor: saved_c}
end
defp snowball_do_b(state, fun) do
rel = state.limit - state.cursor
{_, s} = fun.(state)
%{s | cursor: s.limit - rel}
end
defp snowball_test_b(state, fun) do
rel = state.limit - state.cursor
case fun.(state) do
{:ok, s} -> {:ok, %{s | cursor: s.limit - rel}}
{:fail, s} -> {:fail, %{s | cursor: s.limit - rel}}
end
end
defp snowball_try(state, fun) do
rel = state.limit - state.cursor
case fun.(state) do
{:ok, s} -> s
{:fail, s} -> %{s | cursor: s.limit - rel}
end
end
defp snowball_or(state, fun1, fun2) do
rel = state.limit - state.cursor
case fun1.(state) do
{:ok, s} -> {:ok, s}
{:fail, s} -> fun2.(%{s | cursor: s.limit - rel})
end
end
defp lift(state, :fail), do: {:fail, state}
defp lift(_state, %Runtime{} = s), do: {:ok, s}
defp next_codepoint(%Runtime{cursor: c, limit: lim, current: cur} = state) do
case Runtime.codepoint_at(cur, c, lim) do
{_cp, size} -> {:ok, %{state | cursor: c + size}}
:error -> {:fail, state}
end
end
defp next_codepoint_b(%Runtime{cursor: c, limit_backward: lb, current: cur} = state) do
case Runtime.codepoint_before(cur, c, lb) do
{_cp, size} -> {:ok, %{state | cursor: c - size}}
:error -> {:fail, state}
end
end
defp r_Step_5(%Runtime{} = state) do
(fn ->
state = %{state | ket: state.cursor}
case Runtime.find_among_b(state, @a_0) do
:fail -> {:fail, state}
{%Runtime{} = s, result} ->
state = %{s | bra: s.cursor}
case result do
1 ->
case (fn state ->
snowball_or(state,
fn state ->
r_R2(state)
end,
fn state ->
case (fn state ->
r_R1(state)
end).(state) do
{:ok, state} ->
(fn state ->
saved_c = state.cursor
case (fn state ->
r_shortv(state)
end).(state) do
{:ok, s} -> {:fail, %{s | cursor: saved_c}}
{:fail, s} -> {:ok, %{s | cursor: saved_c}}
end
end).(state)
r -> r
end
end)
end).(state) do
{:ok, state} ->
{:ok, Runtime.slice_del(state)}
r -> r
end
2 ->
case (fn state ->
r_R2(state)
end).(state) do
{:ok, state} ->
case (fn state ->
lift(state, Runtime.eq_s_b(state, "l"))
end).(state) do
{:ok, state} ->
{:ok, Runtime.slice_del(state)}
r -> r
end
r -> r
end
_ -> {:ok, state}
end
end
end).()
end
defp r_Step_4(%Runtime{} = state) do
(fn ->
state = %{state | ket: state.cursor}
case Runtime.find_among_b(state, @a_1) do
:fail -> {:fail, state}
{%Runtime{} = s, result} ->
state = %{s | bra: s.cursor}
case (fn state ->
r_R2(state)
end).(state) do
{:ok, state} ->
case result do
1 ->
{:ok, Runtime.slice_del(state)}
2 ->
case (fn state ->
snowball_or(state,
fn state ->
lift(state, Runtime.eq_s_b(state, "s"))
end,
fn state ->
lift(state, Runtime.eq_s_b(state, "t"))
end)
end).(state) do
{:ok, state} ->
{:ok, Runtime.slice_del(state)}
r -> r
end
_ -> {:ok, state}
end
r -> r
end
end
end).()
end
defp r_Step_3(%Runtime{} = state) do
(fn ->
state = %{state | ket: state.cursor}
case Runtime.find_among_b(state, @a_2) do
:fail -> {:fail, state}
{%Runtime{} = s, result} ->
state = %{s | bra: s.cursor}
case (fn state ->
r_R1(state)
end).(state) do
{:ok, state} ->
case result do
1 ->
{:ok, Runtime.slice_from(state, "tion")}
2 ->
{:ok, Runtime.slice_from(state, "ate")}
3 ->
{:ok, Runtime.slice_from(state, "al")}
4 ->
{:ok, Runtime.slice_from(state, "ic")}
5 ->
{:ok, Runtime.slice_del(state)}
6 ->
case (fn state ->
r_R2(state)
end).(state) do
{:ok, state} ->
{:ok, Runtime.slice_del(state)}
r -> r
end
_ -> {:ok, state}
end
r -> r
end
end
end).()
end
defp r_Step_2(%Runtime{} = state) do
(fn ->
state = %{state | ket: state.cursor}
case Runtime.find_among_b(state, @a_3) do
:fail -> {:fail, state}
{%Runtime{} = s, result} ->
state = %{s | bra: s.cursor}
case (fn state ->
r_R1(state)
end).(state) do
{:ok, state} ->
case result do
1 ->
{:ok, Runtime.slice_from(state, "tion")}
2 ->
{:ok, Runtime.slice_from(state, "ence")}
3 ->
{:ok, Runtime.slice_from(state, "ance")}
4 ->
{:ok, Runtime.slice_from(state, "able")}
5 ->
{:ok, Runtime.slice_from(state, "ent")}
6 ->
{:ok, Runtime.slice_from(state, "ize")}
7 ->
{:ok, Runtime.slice_from(state, "ate")}
8 ->
{:ok, Runtime.slice_from(state, "al")}
9 ->
{:ok, Runtime.slice_from(state, "ful")}
10 ->
{:ok, Runtime.slice_from(state, "ous")}
11 ->
{:ok, Runtime.slice_from(state, "ive")}
12 ->
{:ok, Runtime.slice_from(state, "ble")}
13 ->
{:ok, Runtime.slice_from(state, "og")}
14 ->
case (fn state ->
lift(state, Runtime.eq_s_b(state, "l"))
end).(state) do
{:ok, state} ->
{:ok, Runtime.slice_from(state, "og")}
r -> r
end
15 ->
{:ok, Runtime.slice_from(state, "ful")}
16 ->
{:ok, Runtime.slice_from(state, "less")}
17 ->
case (fn state ->
lift(state, Runtime.in_grouping_b(state, @g_valid_LI))
end).(state) do
{:ok, state} ->
{:ok, Runtime.slice_del(state)}
r -> r
end
_ -> {:ok, state}
end
r -> r
end
end
end).()
end
defp r_Step_1c(%Runtime{} = state) do
case (fn state ->
{:ok, %{state | ket: state.cursor}}
end).(state) do
{:ok, state} ->
case (fn state ->
snowball_or(state,
fn state ->
lift(state, Runtime.eq_s_b(state, "y"))
end,
fn state ->
lift(state, Runtime.eq_s_b(state, "Y"))
end)
end).(state) do
{:ok, state} ->
case (fn state ->
{:ok, %{state | bra: state.cursor}}
end).(state) do
{:ok, state} ->
case (fn state ->
lift(state, Runtime.out_grouping_b(state, @g_v))
end).(state) do
{:ok, state} ->
case (fn state ->
(fn state ->
saved_c = state.cursor
case (fn state ->
if state.cursor <= state.limit_backward, do: {:ok, state}, else: {:fail, state}
end).(state) do
{:ok, s} -> {:fail, %{s | cursor: saved_c}}
{:fail, s} -> {:ok, %{s | cursor: saved_c}}
end
end).(state)
end).(state) do
{:ok, state} ->
{:ok, Runtime.slice_from(state, "i")}
r -> r
end
r -> r
end
end
r -> r
end
end
end
defp r_Step_1b(%Runtime{} = state) do
(fn ->
state = %{state | ket: state.cursor}
case Runtime.find_among_b(state, @a_6) do
:fail -> {:fail, state}
{%Runtime{} = s, result} ->
state = %{s | bra: s.cursor}
after_find_rel = state.limit - state.cursor
case (fn state ->
case result do
1 ->
{:ok, snowball_do_b(state, fn state ->
case (fn state ->
r_R1(state)
end).(state) do
{:ok, state} ->
snowball_or(state,
fn state ->
(fn ->
case Runtime.find_among_b(state, @a_4) do
:fail -> {:fail, state}
{%Runtime{} = s, result} ->
state = s
case result do
1 ->
if state.cursor <= state.limit_backward, do: {:ok, state}, else: {:fail, state}
_ -> {:ok, s}
end
end
end).()
end,
fn state ->
{:ok, Runtime.slice_from(state, "ee")}
end)
r -> r
end
end)}
2 ->
{:fail, state}
3 ->
(fn ->
case Runtime.find_among_b(state, @a_5) do
:fail -> {:fail, state}
{%Runtime{} = s, result} ->
state = s
case result do
1 ->
case (fn state ->
snowball_test_b(state, fn state ->
case (fn state ->
lift(state, Runtime.out_grouping_b(state, @g_v))
end).(state) do
{:ok, state} ->
if state.cursor <= state.limit_backward, do: {:ok, state}, else: {:fail, state}
r -> r
end
end)
end).(state) do
{:ok, state} ->
case (fn state ->
{:ok, %{state | bra: state.cursor}}
end).(state) do
{:ok, state} ->
{:ok, Runtime.slice_from(state, "ie")}
end
r -> r
end
2 ->
if state.cursor <= state.limit_backward, do: {:ok, state}, else: {:fail, state}
_ -> {:ok, s}
end
end
end).()
_ -> {:ok, state}
end
end).(state) do
{:ok, s} -> {:ok, s}
{:fail, s} ->
state = %{s | cursor: s.limit - after_find_rel}
case (fn state ->
snowball_test_b(state, fn state ->
case Runtime.go_out_grouping_b(state, @g_v) do
:fail -> {:fail, state}
%Runtime{} = s -> next_codepoint_b(s)
end
end)
end).(state) do
{:ok, state} ->
case (fn state ->
{:ok, Runtime.slice_del(state)}
end).(state) do
{:ok, state} ->
case (fn state ->
{:ok, %{state | ket: state.cursor}}
end).(state) do
{:ok, state} ->
case (fn state ->
{:ok, %{state | bra: state.cursor}}
end).(state) do
{:ok, state} ->
case (fn state ->
snowball_test_b(state, fn state ->
(fn ->
case Runtime.find_among_b(state, @a_7) do
:fail -> {:fail, state}
{%Runtime{} = s, result} ->
state = s
case result do
1 ->
case (fn state ->
{:ok, Runtime.slice_from(state, "e")}
end).(state) do
{:ok, s} -> {:fail, s}
end
2 ->
(fn state ->
saved_c = state.cursor
case (fn state ->
case (fn state ->
lift(state, Runtime.in_grouping_b(state, @g_aeo))
end).(state) do
{:ok, state} ->
if state.cursor <= state.limit_backward, do: {:ok, state}, else: {:fail, state}
r -> r
end
end).(state) do
{:ok, s} -> {:fail, %{s | cursor: saved_c}}
{:fail, s} -> {:ok, %{s | cursor: saved_c}}
end
end).(state)
3 ->
case (fn state ->
case (fn state ->
if state.cursor == state.vars[:p1], do: {:ok, state}, else: {:fail, state}
end).(state) do
{:ok, state} ->
case (fn state ->
snowball_test_b(state, fn state ->
r_shortv(state)
end)
end).(state) do
{:ok, state} ->
{:ok, Runtime.slice_from(state, "e")}
r -> r
end
r -> r
end
end).(state) do
{:ok, s} -> {:fail, s}
r -> r
end
_ -> {:ok, state}
end
end
end).()
end)
end).(state) do
{:ok, state} ->
case (fn state ->
{:ok, %{state | ket: state.cursor}}
end).(state) do
{:ok, state} ->
case (fn state ->
next_codepoint_b(state)
end).(state) do
{:ok, state} ->
case (fn state ->
{:ok, %{state | bra: state.cursor}}
end).(state) do
{:ok, state} ->
{:ok, Runtime.slice_del(state)}
end
r -> r
end
end
r -> r
end
end
end
end
r -> r
end
end
end
end).()
end
defp r_Step_1a(%Runtime{} = state) do
case (fn state ->
{:ok, snowball_try(state, fn state ->
(fn ->
state = %{state | ket: state.cursor}
case Runtime.find_among_b(state, @a_8) do
:fail -> {:fail, state}
{%Runtime{} = s, result} ->
state = %{s | bra: s.cursor}
case result do
1 ->
{:ok, Runtime.slice_del(state)}
_ -> {:ok, state}
end
end
end).()
end)}
end).(state) do
{:ok, state} ->
(fn ->
state = %{state | ket: state.cursor}
case Runtime.find_among_b(state, @a_9) do
:fail -> {:fail, state}
{%Runtime{} = s, result} ->
state = %{s | bra: s.cursor}
case result do
1 ->
{:ok, Runtime.slice_from(state, "ss")}
2 ->
snowball_or(state,
fn state ->
case (fn state ->
(fn ->
n = 2
Enum.reduce_while(1..max(n, 0)//1, {:ok, state}, fn _, {:ok, s} ->
case next_codepoint_b(s) do
{:ok, s2} -> {:cont, {:ok, s2}}
{:fail, _} -> {:halt, {:fail, state}}
end
end)
end).()
end).(state) do
{:ok, state} ->
{:ok, Runtime.slice_from(state, "i")}
r -> r
end
end,
fn state ->
{:ok, Runtime.slice_from(state, "ie")}
end)
3 ->
case (fn state ->
next_codepoint_b(state)
end).(state) do
{:ok, state} ->
case (fn state ->
case Runtime.go_out_grouping_b(state, @g_v) do
:fail -> {:fail, state}
%Runtime{} = s -> next_codepoint_b(s)
end
end).(state) do
{:ok, state} ->
{:ok, Runtime.slice_del(state)}
r -> r
end
r -> r
end
_ -> {:ok, state}
end
end
end).()
end
end
defp r_R2(%Runtime{} = state) do
if state.vars[:p2] <= state.cursor, do: {:ok, state}, else: {:fail, state}
end
defp r_R1(%Runtime{} = state) do
if state.vars[:p1] <= state.cursor, do: {:ok, state}, else: {:fail, state}
end
defp r_shortv(%Runtime{} = state) do
snowball_or(state,
fn state ->
snowball_or(state,
fn state ->
case (fn state ->
lift(state, Runtime.out_grouping_b(state, @g_v_WXY))
end).(state) do
{:ok, state} ->
case (fn state ->
lift(state, Runtime.in_grouping_b(state, @g_v))
end).(state) do
{:ok, state} ->
lift(state, Runtime.out_grouping_b(state, @g_v))
r -> r
end
r -> r
end
end,
fn state ->
case (fn state ->
lift(state, Runtime.out_grouping_b(state, @g_v))
end).(state) do
{:ok, state} ->
case (fn state ->
lift(state, Runtime.in_grouping_b(state, @g_v))
end).(state) do
{:ok, state} ->
if state.cursor <= state.limit_backward, do: {:ok, state}, else: {:fail, state}
r -> r
end
r -> r
end
end)
end,
fn state ->
lift(state, Runtime.eq_s_b(state, "past"))
end)
end
defp r_prelude(%Runtime{} = state) do
case (fn state ->
{:ok, put_in(state.vars[:Y_found], false)}
end).(state) do
{:ok, state} ->
case (fn state ->
{:ok, snowball_do_f(state, fn state ->
case (fn state ->
{:ok, %{state | bra: state.cursor}}
end).(state) do
{:ok, state} ->
case (fn state ->
lift(state, Runtime.eq_s(state, "'"))
end).(state) do
{:ok, state} ->
case (fn state ->
{:ok, %{state | ket: state.cursor}}
end).(state) do
{:ok, state} ->
{:ok, Runtime.slice_del(state)}
end
r -> r
end
end
end)}
end).(state) do
{:ok, state} ->
case (fn state ->
{:ok, snowball_do_f(state, fn state ->
case (fn state ->
{:ok, %{state | bra: state.cursor}}
end).(state) do
{:ok, state} ->
case (fn state ->
lift(state, Runtime.eq_s(state, "y"))
end).(state) do
{:ok, state} ->
case (fn state ->
{:ok, %{state | ket: state.cursor}}
end).(state) do
{:ok, state} ->
case (fn state ->
{:ok, Runtime.slice_from(state, "Y")}
end).(state) do
{:ok, state} ->
{:ok, put_in(state.vars[:Y_found], true)}
end
end
r -> r
end
end
end)}
end).(state) do
{:ok, state} ->
{:ok, snowball_do_f(state, fn state ->
(fn loop_fn ->
loop_fn.(loop_fn, state)
end).(fn loop_fn, state ->
case (fn state ->
case (fn state ->
(fn loop_fn ->
loop_fn.(loop_fn, state)
end).(fn loop_fn, state ->
v = state.cursor
case (fn state ->
case (fn state ->
lift(state, Runtime.in_grouping(state, @g_v))
end).(state) do
{:ok, state} ->
case (fn state ->
{:ok, %{state | bra: state.cursor}}
end).(state) do
{:ok, state} ->
case (fn state ->
lift(state, Runtime.eq_s(state, "y"))
end).(state) do
{:ok, state} ->
{:ok, %{state | ket: state.cursor}}
r -> r
end
end
r -> r
end
end).(state) do
{:ok, s} -> {:ok, %{s | cursor: v}}
{:fail, _} ->
case next_codepoint(%{state | cursor: v}) do
{:ok, s} -> loop_fn.(loop_fn, s)
{:fail, _} -> {:fail, state}
end
end
end)
end).(state) do
{:ok, state} ->
case (fn state ->
{:ok, Runtime.slice_from(state, "Y")}
end).(state) do
{:ok, state} ->
{:ok, put_in(state.vars[:Y_found], true)}
end
r -> r
end
end).(state) do
{:ok, s} -> loop_fn.(loop_fn, s)
{:fail, s} -> {:ok, %{s | cursor: state.cursor}}
end
end)
end)}
end
end
end
end
defp r_mark_regions(%Runtime{} = state) do
case (fn state ->
{:ok, put_in(state.vars[:p1], state.limit)}
end).(state) do
{:ok, state} ->
case (fn state ->
{:ok, put_in(state.vars[:p2], state.limit)}
end).(state) do
{:ok, state} ->
{:ok, snowball_do_f(state, fn state ->
case (fn state ->
snowball_or(state,
fn state ->
(fn ->
case Runtime.find_among(state, @a_10) do
:fail -> {:fail, state}
{%Runtime{} = s, _} -> {:ok, s}
end
end).()
end,
fn state ->
case (fn state ->
case Runtime.go_out_grouping(state, @g_v) do
:fail -> {:fail, state}
%Runtime{} = s -> next_codepoint(s)
end
end).(state) do
{:ok, state} ->
case Runtime.go_in_grouping(state, @g_v) do
:fail -> {:fail, state}
%Runtime{} = s -> next_codepoint(s)
end
r -> r
end
end)
end).(state) do
{:ok, state} ->
case (fn state ->
{:ok, put_in(state.vars[:p1], state.cursor)}
end).(state) do
{:ok, state} ->
case (fn state ->
case Runtime.go_out_grouping(state, @g_v) do
:fail -> {:fail, state}
%Runtime{} = s -> next_codepoint(s)
end
end).(state) do
{:ok, state} ->
case (fn state ->
case Runtime.go_in_grouping(state, @g_v) do
:fail -> {:fail, state}
%Runtime{} = s -> next_codepoint(s)
end
end).(state) do
{:ok, state} ->
{:ok, put_in(state.vars[:p2], state.cursor)}
r -> r
end
r -> r
end
end
r -> r
end
end)}
end
end
end
defp r_exception1(%Runtime{} = state) do
(fn ->
state = %{state | bra: state.cursor}
case Runtime.find_among(state, @a_11) do
:fail -> {:fail, state}
{%Runtime{} = s, result} ->
state = %{s | ket: s.cursor}
case (fn state ->
if state.cursor >= state.limit, do: {:ok, state}, else: {:fail, state}
end).(state) do
{:ok, state} ->
case result do
1 ->
{:ok, Runtime.slice_from(state, "ski")}
2 ->
{:ok, Runtime.slice_from(state, "sky")}
3 ->
{:ok, Runtime.slice_from(state, "idl")}
4 ->
{:ok, Runtime.slice_from(state, "gentl")}
5 ->
{:ok, Runtime.slice_from(state, "ugli")}
6 ->
{:ok, Runtime.slice_from(state, "earli")}
7 ->
{:ok, Runtime.slice_from(state, "onli")}
8 ->
{:ok, Runtime.slice_from(state, "singl")}
_ -> {:ok, state}
end
r -> r
end
end
end).()
end
defp r_postlude(%Runtime{} = state) do
case (fn state ->
if state.vars[:Y_found], do: {:ok, state}, else: {:fail, state}
end).(state) do
{:ok, state} ->
(fn loop_fn ->
loop_fn.(loop_fn, state)
end).(fn loop_fn, state ->
case (fn state ->
case (fn state ->
(fn loop_fn ->
loop_fn.(loop_fn, state)
end).(fn loop_fn, state ->
v = state.cursor
case (fn state ->
case (fn state ->
{:ok, %{state | bra: state.cursor}}
end).(state) do
{:ok, state} ->
case (fn state ->
lift(state, Runtime.eq_s(state, "Y"))
end).(state) do
{:ok, state} ->
{:ok, %{state | ket: state.cursor}}
r -> r
end
end
end).(state) do
{:ok, s} -> {:ok, %{s | cursor: v}}
{:fail, _} ->
case next_codepoint(%{state | cursor: v}) do
{:ok, s} -> loop_fn.(loop_fn, s)
{:fail, _} -> {:fail, state}
end
end
end)
end).(state) do
{:ok, state} ->
{:ok, Runtime.slice_from(state, "y")}
r -> r
end
end).(state) do
{:ok, s} -> loop_fn.(loop_fn, s)
{:fail, s} -> {:ok, %{s | cursor: state.cursor}}
end
end)
r -> r
end
end
defp r_stem(%Runtime{} = state) do
snowball_or(state,
fn state ->
snowball_or(state,
fn state ->
r_exception1(state)
end,
fn state ->
(fn state ->
saved_c = state.cursor
case (fn state ->
(fn ->
n = 3
Enum.reduce_while(1..max(n, 0)//1, {:ok, state}, fn _, {:ok, s} ->
case next_codepoint(s) do
{:ok, s2} -> {:cont, {:ok, s2}}
{:fail, _} -> {:halt, {:fail, state}}
end
end)
end).()
end).(state) do
{:ok, s} -> {:fail, %{s | cursor: saved_c}}
{:fail, s} -> {:ok, %{s | cursor: saved_c}}
end
end).(state)
end)
end,
fn state ->
case (fn state ->
{:ok, snowball_do_f(state, fn state ->
r_prelude(state)
end)}
end).(state) do
{:ok, state} ->
case (fn state ->
{:ok, snowball_do_f(state, fn state ->
r_mark_regions(state)
end)}
end).(state) do
{:ok, state} ->
case (fn state ->
(fn state ->
old_cursor = state.cursor
old_lb = state.limit_backward
state = %{state | cursor: state.limit, limit_backward: old_cursor}
{tag, s} = (fn state ->
case (fn state ->
{:ok, snowball_do_b(state, fn state ->
r_Step_1a(state)
end)}
end).(state) do
{:ok, state} ->
case (fn state ->
{:ok, snowball_do_b(state, fn state ->
r_Step_1b(state)
end)}
end).(state) do
{:ok, state} ->
case (fn state ->
{:ok, snowball_do_b(state, fn state ->
r_Step_1c(state)
end)}
end).(state) do
{:ok, state} ->
case (fn state ->
{:ok, snowball_do_b(state, fn state ->
r_Step_2(state)
end)}
end).(state) do
{:ok, state} ->
case (fn state ->
{:ok, snowball_do_b(state, fn state ->
r_Step_3(state)
end)}
end).(state) do
{:ok, state} ->
case (fn state ->
{:ok, snowball_do_b(state, fn state ->
r_Step_4(state)
end)}
end).(state) do
{:ok, state} ->
{:ok, snowball_do_b(state, fn state ->
r_Step_5(state)
end)}
end
end
end
end
end
end
end).(state)
{tag, %{s | cursor: old_cursor, limit_backward: old_lb}}
end).(state)
end).(state) do
{:ok, state} ->
{:ok, snowball_do_f(state, fn state ->
r_postlude(state)
end)}
end
end
end
end)
end
end