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 arabic.ex
Raw

lib/text/stemmer/stemmers/arabic.ex

# Generated by Snowball.Generator — do not edit by hand.
defmodule Text.Stemmer.Stemmers.Arabic do
@moduledoc """
Snowball stemmer for arabic.
Generated from the canonical Snowball algorithm source.
"""
alias Snowball.Runtime
# Among tables
@a_0 [
{"ى", -1, 1, nil}
]
@a_1 [
{"و", -1, 1, nil},
{"تمو", 0, 2, nil}
]
@a_2 [
{"تم", -1, 1, nil},
{"وا", -1, 1, nil}
]
@a_3 [
{"ن", -1, 2, nil},
{"ون", 0, 4, nil},
{"ين", 0, 4, nil},
{"ان", 0, 4, nil},
{"تن", 0, 3, nil},
{"ي", -1, 2, nil},
{"ا", -1, 2, nil},
{"تما", 6, 5, nil},
{"نا", 6, 3, nil},
{"تا", 6, 3, nil},
{"ت", -1, 1, nil}
]
@a_4 [
{"ك", -1, 1, nil},
{"كم", -1, 2, nil},
{"هم", -1, 2, nil},
{"كن", -1, 2, nil},
{"هن", -1, 2, nil},
{"ه", -1, 1, nil},
{"كمو", -1, 3, nil},
{"ني", -1, 2, nil},
{"كما", -1, 3, nil},
{"هما", -1, 3, nil},
{"نا", -1, 2, nil},
{"ها", -1, 2, nil}
]
@a_5 [
{"ي", -1, 1, nil}
]
@a_6 [
{"ة", -1, 1, nil}
]
@a_7 [
{"ت", -1, 1, nil}
]
@a_8 [
{"ات", -1, 1, nil}
]
@a_9 [
{"و", -1, 1, nil},
{"ي", -1, 1, nil},
{"ا", -1, 1, nil}
]
@a_10 [
{"ن", -1, 1, nil}
]
@a_11 [
{"ك", -1, 1, nil},
{"كم", -1, 2, nil},
{"هم", -1, 2, nil},
{"هن", -1, 2, nil},
{"ه", -1, 1, nil},
{"ي", -1, 1, nil},
{"كما", -1, 3, nil},
{"هما", -1, 3, nil},
{"نا", -1, 2, nil},
{"ها", -1, 2, nil}
]
@a_13 [
{"آ", -1, 1, nil},
{"أ", -1, 1, nil},
{"ؤ", -1, 2, nil},
{"إ", -1, 1, nil},
{"ئ", -1, 3, nil}
]
@a_15 [
{"ال", -1, 2, nil},
{"بال", -1, 1, nil},
{"كال", -1, 1, nil},
{"لل", -1, 2, nil}
]
@a_16 [
{"أآ", -1, 2, nil},
{"أأ", -1, 1, nil},
{"أؤ", -1, 3, nil},
{"أإ", -1, 5, nil},
{"أا", -1, 4, nil}
]
@a_17 [
{"ف", -1, 1, nil},
{"و", -1, 1, nil}
]
@a_18 [
{"ال", -1, 2, nil},
{"بال", -1, 1, nil},
{"كال", -1, 1, nil},
{"لل", -1, 2, nil}
]
@a_19 [
{"ب", -1, 1, nil},
{"با", 0, -1, nil},
{"بب", 0, 2, nil},
{"كك", -1, 3, nil}
]
@a_20 [
{"سأ", -1, 4, nil},
{"ست", -1, 2, nil},
{"سن", -1, 3, nil},
{"سي", -1, 1, nil}
]
@a_21 [
{"تست", -1, 1, nil},
{"نست", -1, 1, nil},
{"يست", -1, 1, nil}
]
# Scan-and-replace character maps
@scan_0 %{1600 => "", 1611 => "", 1612 => "", 1613 => "", 1614 => "", 1615 => "", 1616 => "", 1617 => "", 1618 => "", 1632 => "0", 1633 => "1", 1634 => "2", 1635 => "3", 1636 => "4", 1637 => "5", 1638 => "6", 1639 => "7", 1640 => "8", 1641 => "9", 65152 => "ء", 65153 => "آ", 65154 => "آ", 65155 => "أ", 65156 => "أ", 65157 => "ؤ", 65158 => "ؤ", 65159 => "إ", 65160 => "إ", 65161 => "ئ", 65162 => "ئ", 65163 => "ئ", 65164 => "ئ", 65165 => "ا", 65166 => "ا", 65167 => "ب", 65168 => "ب", 65169 => "ب", 65170 => "ب", 65171 => "ة", 65172 => "ة", 65173 => "ت", 65174 => "ت", 65175 => "ت", 65176 => "ت", 65177 => "ث", 65178 => "ث", 65179 => "ث", 65180 => "ث", 65181 => "ج", 65182 => "ج", 65183 => "ج", 65184 => "ج", 65185 => "ح", 65186 => "ح", 65187 => "ح", 65188 => "ح", 65189 => "خ", 65190 => "خ", 65191 => "خ", 65192 => "خ", 65193 => "د", 65194 => "د", 65195 => "ذ", 65196 => "ذ", 65197 => "ر", 65198 => "ر", 65199 => "ز", 65200 => "ز", 65201 => "س", 65202 => "س", 65203 => "س", 65204 => "س", 65205 => "ش", 65206 => "ش", 65207 => "ش", 65208 => "ش", 65209 => "ص", 65210 => "ص", 65211 => "ص", 65212 => "ص", 65213 => "ض", 65214 => "ض", 65215 => "ض", 65216 => "ض", 65217 => "ط", 65218 => "ط", 65219 => "ط", 65220 => "ط", 65221 => "ظ", 65222 => "ظ", 65223 => "ظ", 65224 => "ظ", 65225 => "ع", 65226 => "ع", 65227 => "ع", 65228 => "ع", 65229 => "غ", 65230 => "غ", 65231 => "غ", 65232 => "غ", 65233 => "ف", 65234 => "ف", 65235 => "ف", 65236 => "ف", 65237 => "ق", 65238 => "ق", 65239 => "ق", 65240 => "ق", 65241 => "ك", 65242 => "ك", 65243 => "ك", 65244 => "ك", 65245 => "ل", 65246 => "ل", 65247 => "ل", 65248 => "ل", 65249 => "م", 65250 => "م", 65251 => "م", 65252 => "م", 65253 => "ن", 65254 => "ن", 65255 => "ن", 65256 => "ن", 65257 => "ه", 65258 => "ه", 65259 => "ه", 65260 => "ه", 65261 => "و", 65262 => "و", 65263 => "ى", 65264 => "ى", 65265 => "ي", 65266 => "ي", 65267 => "ي", 65268 => "ي", 65269 => "لآ", 65270 => "لآ", 65271 => "لأ", 65272 => "لأ", 65273 => "لإ", 65274 => "لإ", 65275 => "لا", 65276 => "لا"}
@scan_1 %{1570 => "ا", 1571 => "ا", 1572 => "و", 1573 => "ا", 1574 => "ي"}
@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: %{is_defined: false, is_noun: false, is_verb: 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_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_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_Suffix_All_alef_maqsura(%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 ->
{:ok, Runtime.slice_from(state, "ي")}
_ -> {:ok, state}
end
end
end).()
end
defp r_Suffix_Verb_Step2c(%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 result do
1 ->
case (fn state ->
if Runtime.codepoint_length(state.current) >= 4, do: {:ok, state}, else: {:fail, state}
end).(state) do
{:ok, state} ->
{:ok, Runtime.slice_del(state)}
r -> r
end
2 ->
case (fn state ->
if Runtime.codepoint_length(state.current) >= 6, do: {:ok, state}, else: {:fail, state}
end).(state) do
{:ok, state} ->
{:ok, Runtime.slice_del(state)}
r -> r
end
_ -> {:ok, state}
end
end
end).()
end
defp r_Suffix_Verb_Step2b(%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 result do
1 ->
case (fn state ->
if Runtime.codepoint_length(state.current) >= 5, do: {:ok, state}, else: {:fail, state}
end).(state) do
{:ok, state} ->
{:ok, Runtime.slice_del(state)}
r -> r
end
_ -> {:ok, state}
end
end
end).()
end
defp r_Suffix_Verb_Step2a(%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 result do
1 ->
case (fn state ->
if Runtime.codepoint_length(state.current) >= 4, do: {:ok, state}, else: {:fail, state}
end).(state) do
{:ok, state} ->
{:ok, Runtime.slice_del(state)}
r -> r
end
2 ->
case (fn state ->
if Runtime.codepoint_length(state.current) >= 4, do: {:ok, state}, else: {:fail, state}
end).(state) do
{:ok, state} ->
{:ok, Runtime.slice_del(state)}
r -> r
end
3 ->
case (fn state ->
if Runtime.codepoint_length(state.current) >= 5, do: {:ok, state}, else: {:fail, state}
end).(state) do
{:ok, state} ->
{:ok, Runtime.slice_del(state)}
r -> r
end
4 ->
case (fn state ->
if Runtime.codepoint_length(state.current) > 5, do: {:ok, state}, else: {:fail, state}
end).(state) do
{:ok, state} ->
{:ok, Runtime.slice_del(state)}
r -> r
end
5 ->
case (fn state ->
if Runtime.codepoint_length(state.current) >= 6, do: {:ok, state}, else: {:fail, state}
end).(state) do
{:ok, state} ->
{:ok, Runtime.slice_del(state)}
r -> r
end
_ -> {:ok, state}
end
end
end).()
end
defp r_Suffix_Verb_Step1(%Runtime{} = state) do
(fn ->
state = %{state | ket: state.cursor}
case Runtime.find_among_b(state, @a_4) do
:fail -> {:fail, state}
{%Runtime{} = s, result} ->
state = %{s | bra: s.cursor}
case result do
1 ->
case (fn state ->
if Runtime.codepoint_length(state.current) >= 4, do: {:ok, state}, else: {:fail, state}
end).(state) do
{:ok, state} ->
{:ok, Runtime.slice_del(state)}
r -> r
end
2 ->
case (fn state ->
if Runtime.codepoint_length(state.current) >= 5, do: {:ok, state}, else: {:fail, state}
end).(state) do
{:ok, state} ->
{:ok, Runtime.slice_del(state)}
r -> r
end
3 ->
case (fn state ->
if Runtime.codepoint_length(state.current) >= 6, do: {:ok, state}, else: {:fail, state}
end).(state) do
{:ok, state} ->
{:ok, Runtime.slice_del(state)}
r -> r
end
_ -> {:ok, state}
end
end
end).()
end
defp r_Suffix_Noun_Step3(%Runtime{} = state) do
(fn ->
state = %{state | ket: state.cursor}
case Runtime.find_among_b(state, @a_5) do
:fail -> {:fail, state}
{%Runtime{} = s, result} ->
state = %{s | bra: s.cursor}
case result do
1 ->
case (fn state ->
if Runtime.codepoint_length(state.current) >= 3, do: {:ok, state}, else: {:fail, state}
end).(state) do
{:ok, state} ->
{:ok, Runtime.slice_del(state)}
r -> r
end
_ -> {:ok, state}
end
end
end).()
end
defp r_Suffix_Noun_Step2c2(%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}
case result do
1 ->
case (fn state ->
if Runtime.codepoint_length(state.current) >= 4, do: {:ok, state}, else: {:fail, state}
end).(state) do
{:ok, state} ->
{:ok, Runtime.slice_del(state)}
r -> r
end
_ -> {:ok, state}
end
end
end).()
end
defp r_Suffix_Noun_Step2c1(%Runtime{} = state) do
(fn ->
state = %{state | ket: state.cursor}
case Runtime.find_among_b(state, @a_7) do
:fail -> {:fail, state}
{%Runtime{} = s, result} ->
state = %{s | bra: s.cursor}
case result do
1 ->
case (fn state ->
if Runtime.codepoint_length(state.current) >= 4, do: {:ok, state}, else: {:fail, state}
end).(state) do
{:ok, state} ->
{:ok, Runtime.slice_del(state)}
r -> r
end
_ -> {:ok, state}
end
end
end).()
end
defp r_Suffix_Noun_Step2b(%Runtime{} = state) do
(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 ->
case (fn state ->
if Runtime.codepoint_length(state.current) >= 5, do: {:ok, state}, else: {:fail, state}
end).(state) do
{:ok, state} ->
{:ok, Runtime.slice_del(state)}
r -> r
end
_ -> {:ok, state}
end
end
end).()
end
defp r_Suffix_Noun_Step2a(%Runtime{} = state) do
(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 ->
case (fn state ->
if Runtime.codepoint_length(state.current) > 4, do: {:ok, state}, else: {:fail, state}
end).(state) do
{:ok, state} ->
{:ok, Runtime.slice_del(state)}
r -> r
end
_ -> {:ok, state}
end
end
end).()
end
defp r_Suffix_Noun_Step1b(%Runtime{} = state) do
(fn ->
state = %{state | ket: state.cursor}
case Runtime.find_among_b(state, @a_10) do
:fail -> {:fail, state}
{%Runtime{} = s, result} ->
state = %{s | bra: s.cursor}
case result do
1 ->
case (fn state ->
if Runtime.codepoint_length(state.current) > 5, do: {:ok, state}, else: {:fail, state}
end).(state) do
{:ok, state} ->
{:ok, Runtime.slice_del(state)}
r -> r
end
_ -> {:ok, state}
end
end
end).()
end
defp r_Suffix_Noun_Step1a(%Runtime{} = state) do
(fn ->
state = %{state | ket: state.cursor}
case Runtime.find_among_b(state, @a_11) do
:fail -> {:fail, state}
{%Runtime{} = s, result} ->
state = %{s | bra: s.cursor}
case result do
1 ->
case (fn state ->
if Runtime.codepoint_length(state.current) >= 4, do: {:ok, state}, else: {:fail, state}
end).(state) do
{:ok, state} ->
{:ok, Runtime.slice_del(state)}
r -> r
end
2 ->
case (fn state ->
if Runtime.codepoint_length(state.current) >= 5, do: {:ok, state}, else: {:fail, state}
end).(state) do
{:ok, state} ->
{:ok, Runtime.slice_del(state)}
r -> r
end
3 ->
case (fn state ->
if Runtime.codepoint_length(state.current) >= 6, do: {:ok, state}, else: {:fail, state}
end).(state) do
{:ok, state} ->
{:ok, Runtime.slice_del(state)}
r -> r
end
_ -> {:ok, state}
end
end
end).()
end
defp r_Normalize_pre(%Runtime{} = state) do
{:ok, snowball_do_f(state, fn state ->
{:ok, Runtime.scan_and_replace_forward(state, @scan_0)}
end)}
end
defp r_Normalize_post(%Runtime{} = state) do
case (fn state ->
{:ok, snowball_do_f(state, 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 ->
(fn ->
state = %{state | ket: state.cursor}
case Runtime.find_among_b(state, @a_13) do
:fail -> {:fail, state}
{%Runtime{} = s, result} ->
state = %{s | bra: s.cursor}
case result do
1 ->
{:ok, Runtime.slice_from(state, "ء")}
2 ->
{:ok, Runtime.slice_from(state, "ء")}
3 ->
{:ok, Runtime.slice_from(state, "ء")}
_ -> {:ok, state}
end
end
end).()
end).(state)
{tag, %{s | cursor: old_cursor, limit_backward: old_lb}}
end).(state)
end)}
end).(state) do
{:ok, state} ->
{:ok, snowball_do_f(state, fn state ->
{:ok, Runtime.scan_and_replace_forward(state, @scan_1)}
end)}
end
end
defp r_Checks1(%Runtime{} = state) do
(fn ->
state = %{state | bra: state.cursor}
case Runtime.find_among(state, @a_15) do
:fail -> {:fail, state}
{%Runtime{} = s, result} ->
state = %{s | ket: s.cursor}
case result do
1 ->
case (fn state ->
if Runtime.codepoint_length(state.current) > 4, do: {:ok, state}, else: {:fail, state}
end).(state) do
{:ok, state} ->
case (fn state ->
{:ok, put_in(state.vars[:is_noun], true)}
end).(state) do
{:ok, state} ->
case (fn state ->
{:ok, put_in(state.vars[:is_verb], false)}
end).(state) do
{:ok, state} ->
{:ok, put_in(state.vars[:is_defined], true)}
end
end
r -> r
end
2 ->
case (fn state ->
if Runtime.codepoint_length(state.current) > 3, do: {:ok, state}, else: {:fail, state}
end).(state) do
{:ok, state} ->
case (fn state ->
{:ok, put_in(state.vars[:is_noun], true)}
end).(state) do
{:ok, state} ->
case (fn state ->
{:ok, put_in(state.vars[:is_verb], false)}
end).(state) do
{:ok, state} ->
{:ok, put_in(state.vars[:is_defined], true)}
end
end
r -> r
end
_ -> {:ok, state}
end
end
end).()
end
defp r_Prefix_Step1(%Runtime{} = state) do
(fn ->
state = %{state | bra: state.cursor}
case Runtime.find_among(state, @a_16) do
:fail -> {:fail, state}
{%Runtime{} = s, result} ->
state = %{s | ket: s.cursor}
case result do
1 ->
case (fn state ->
if Runtime.codepoint_length(state.current) > 3, do: {:ok, state}, else: {:fail, state}
end).(state) do
{:ok, state} ->
{:ok, Runtime.slice_from(state, "أ")}
r -> r
end
2 ->
case (fn state ->
if Runtime.codepoint_length(state.current) > 3, do: {:ok, state}, else: {:fail, state}
end).(state) do
{:ok, state} ->
{:ok, Runtime.slice_from(state, "آ")}
r -> r
end
3 ->
case (fn state ->
if Runtime.codepoint_length(state.current) > 3, do: {:ok, state}, else: {:fail, state}
end).(state) do
{:ok, state} ->
{:ok, Runtime.slice_from(state, "أ")}
r -> r
end
4 ->
case (fn state ->
if Runtime.codepoint_length(state.current) > 3, do: {:ok, state}, else: {:fail, state}
end).(state) do
{:ok, state} ->
{:ok, Runtime.slice_from(state, "ا")}
r -> r
end
5 ->
case (fn state ->
if Runtime.codepoint_length(state.current) > 3, do: {:ok, state}, else: {:fail, state}
end).(state) do
{:ok, state} ->
{:ok, Runtime.slice_from(state, "إ")}
r -> r
end
_ -> {:ok, state}
end
end
end).()
end
defp r_Prefix_Step2(%Runtime{} = state) do
(fn ->
state = %{state | bra: state.cursor}
case Runtime.find_among(state, @a_17) do
:fail -> {:fail, state}
{%Runtime{} = s, result} ->
state = %{s | ket: s.cursor}
case result do
1 ->
case (fn state ->
if Runtime.codepoint_length(state.current) > 3, do: {:ok, state}, else: {:fail, state}
end).(state) do
{:ok, state} ->
case (fn state ->
(fn state ->
saved_c = state.cursor
case (fn state ->
lift(state, Runtime.eq_s(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_del(state)}
r -> r
end
r -> r
end
_ -> {:ok, state}
end
end
end).()
end
defp r_Prefix_Step3a_Noun(%Runtime{} = state) do
(fn ->
state = %{state | bra: state.cursor}
case Runtime.find_among(state, @a_18) do
:fail -> {:fail, state}
{%Runtime{} = s, result} ->
state = %{s | ket: s.cursor}
case result do
1 ->
case (fn state ->
if Runtime.codepoint_length(state.current) > 5, do: {:ok, state}, else: {:fail, state}
end).(state) do
{:ok, state} ->
{:ok, Runtime.slice_del(state)}
r -> r
end
2 ->
case (fn state ->
if Runtime.codepoint_length(state.current) > 4, do: {:ok, state}, else: {:fail, state}
end).(state) do
{:ok, state} ->
{:ok, Runtime.slice_del(state)}
r -> r
end
_ -> {:ok, state}
end
end
end).()
end
defp r_Prefix_Step3b_Noun(%Runtime{} = state) do
(fn ->
state = %{state | bra: state.cursor}
case Runtime.find_among(state, @a_19) do
:fail -> {:fail, state}
{%Runtime{} = s, result} ->
state = %{s | ket: s.cursor}
case result do
1 ->
case (fn state ->
if Runtime.codepoint_length(state.current) > 3, do: {:ok, state}, else: {:fail, state}
end).(state) do
{:ok, state} ->
{:ok, Runtime.slice_del(state)}
r -> r
end
2 ->
case (fn state ->
if Runtime.codepoint_length(state.current) > 3, do: {:ok, state}, else: {:fail, state}
end).(state) do
{:ok, state} ->
{:ok, Runtime.slice_from(state, "ب")}
r -> r
end
3 ->
case (fn state ->
if Runtime.codepoint_length(state.current) > 3, do: {:ok, state}, else: {:fail, state}
end).(state) do
{:ok, state} ->
{:ok, Runtime.slice_from(state, "ك")}
r -> r
end
_ -> {:ok, state}
end
end
end).()
end
defp r_Prefix_Step3_Verb(%Runtime{} = state) do
(fn ->
state = %{state | bra: state.cursor}
case Runtime.find_among(state, @a_20) do
:fail -> {:fail, state}
{%Runtime{} = s, result} ->
state = %{s | ket: s.cursor}
case result do
1 ->
case (fn state ->
if Runtime.codepoint_length(state.current) > 4, do: {:ok, state}, else: {:fail, state}
end).(state) do
{:ok, state} ->
{:ok, Runtime.slice_from(state, "ي")}
r -> r
end
2 ->
case (fn state ->
if Runtime.codepoint_length(state.current) > 4, do: {:ok, state}, else: {:fail, state}
end).(state) do
{:ok, state} ->
{:ok, Runtime.slice_from(state, "ت")}
r -> r
end
3 ->
case (fn state ->
if Runtime.codepoint_length(state.current) > 4, do: {:ok, state}, else: {:fail, state}
end).(state) do
{:ok, state} ->
{:ok, Runtime.slice_from(state, "ن")}
r -> r
end
4 ->
case (fn state ->
if Runtime.codepoint_length(state.current) > 4, do: {:ok, state}, else: {:fail, state}
end).(state) do
{:ok, state} ->
{:ok, Runtime.slice_from(state, "أ")}
r -> r
end
_ -> {:ok, state}
end
end
end).()
end
defp r_Prefix_Step4_Verb(%Runtime{} = state) do
(fn ->
state = %{state | bra: state.cursor}
case Runtime.find_among(state, @a_21) do
:fail -> {:fail, state}
{%Runtime{} = s, result} ->
state = %{s | ket: s.cursor}
case result do
1 ->
case (fn state ->
if Runtime.codepoint_length(state.current) > 4, do: {:ok, state}, else: {:fail, state}
end).(state) do
{:ok, state} ->
case (fn state ->
{:ok, put_in(state.vars[:is_verb], true)}
end).(state) do
{:ok, state} ->
case (fn state ->
{:ok, put_in(state.vars[:is_noun], false)}
end).(state) do
{:ok, state} ->
{:ok, Runtime.slice_from(state, "است")}
end
end
r -> r
end
_ -> {:ok, state}
end
end
end).()
end
defp r_stem(%Runtime{} = state) do
case (fn state ->
{:ok, put_in(state.vars[:is_noun], true)}
end).(state) do
{:ok, state} ->
case (fn state ->
{:ok, put_in(state.vars[:is_verb], true)}
end).(state) do
{:ok, state} ->
case (fn state ->
{:ok, put_in(state.vars[:is_defined], false)}
end).(state) do
{:ok, state} ->
case (fn state ->
{:ok, snowball_do_f(state, fn state ->
r_Checks1(state)
end)}
end).(state) do
{:ok, state} ->
case (fn state ->
{:ok, snowball_do_f(state, fn state ->
r_Normalize_pre(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 ->
{:ok, snowball_do_b(state, fn state ->
snowball_or(state,
fn state ->
snowball_or(state,
fn state ->
case (fn state ->
if state.vars[:is_verb], do: {:ok, state}, else: {:fail, state}
end).(state) do
{:ok, state} ->
snowball_or(state,
fn state ->
snowball_or(state,
fn state ->
case (fn state ->
(fn ->
n = 1
case Enum.reduce_while(1..max(n, 0)//1, {:ok, state}, fn _, {:ok, s} ->
case (fn state ->
r_Suffix_Verb_Step1(state)
end).(s) do
{:ok, s2} -> {:cont, {:ok, s2}}
{:fail, s2} -> {:halt, {:fail, s2}}
end
end) do
{:fail, s} -> {:fail, s}
{:ok, state} ->
(fn loop_fn ->
loop_fn.(loop_fn, state)
end).(fn loop_fn, state ->
case (fn state ->
r_Suffix_Verb_Step1(state)
end).(state) do
{:ok, s} -> loop_fn.(loop_fn, s)
{:fail, _} -> {:ok, state}
end
end)
end
end).()
end).(state) do
{:ok, state} ->
snowball_or(state,
fn state ->
snowball_or(state,
fn state ->
r_Suffix_Verb_Step2a(state)
end,
fn state ->
r_Suffix_Verb_Step2c(state)
end)
end,
fn state ->
next_codepoint_b(state)
end)
r -> r
end
end,
fn state ->
r_Suffix_Verb_Step2b(state)
end)
end,
fn state ->
r_Suffix_Verb_Step2a(state)
end)
r -> r
end
end,
fn state ->
case (fn state ->
if state.vars[:is_noun], do: {:ok, state}, else: {:fail, state}
end).(state) do
{:ok, state} ->
case (fn state ->
{:ok, snowball_try(state, fn state ->
snowball_or(state,
fn state ->
snowball_or(state,
fn state ->
snowball_or(state,
fn state ->
snowball_or(state,
fn state ->
r_Suffix_Noun_Step2c2(state)
end,
fn state ->
case (fn state ->
(fn state ->
saved_c = state.cursor
case (fn state ->
if state.vars[:is_defined], 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} ->
case (fn state ->
r_Suffix_Noun_Step1a(state)
end).(state) do
{:ok, state} ->
snowball_or(state,
fn state ->
snowball_or(state,
fn state ->
snowball_or(state,
fn state ->
r_Suffix_Noun_Step2a(state)
end,
fn state ->
r_Suffix_Noun_Step2b(state)
end)
end,
fn state ->
r_Suffix_Noun_Step2c1(state)
end)
end,
fn state ->
next_codepoint_b(state)
end)
r -> r
end
r -> r
end
end)
end,
fn state ->
case (fn state ->
r_Suffix_Noun_Step1b(state)
end).(state) do
{:ok, state} ->
snowball_or(state,
fn state ->
snowball_or(state,
fn state ->
r_Suffix_Noun_Step2a(state)
end,
fn state ->
r_Suffix_Noun_Step2b(state)
end)
end,
fn state ->
r_Suffix_Noun_Step2c1(state)
end)
r -> r
end
end)
end,
fn state ->
case (fn state ->
(fn state ->
saved_c = state.cursor
case (fn state ->
if state.vars[:is_defined], 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} ->
r_Suffix_Noun_Step2a(state)
r -> r
end
end)
end,
fn state ->
r_Suffix_Noun_Step2b(state)
end)
end)}
end).(state) do
{:ok, state} ->
r_Suffix_Noun_Step3(state)
end
r -> r
end
end)
end,
fn state ->
r_Suffix_All_alef_maqsura(state)
end)
end)}
end).(state)
{tag, %{s | cursor: old_cursor, limit_backward: old_lb}}
end).(state)
end).(state) do
{:ok, state} ->
case (fn state ->
{:ok, snowball_do_f(state, fn state ->
case (fn state ->
{:ok, snowball_try(state, fn state ->
r_Prefix_Step1(state)
end)}
end).(state) do
{:ok, state} ->
case (fn state ->
{:ok, snowball_try(state, fn state ->
r_Prefix_Step2(state)
end)}
end).(state) do
{:ok, state} ->
snowball_or(state,
fn state ->
snowball_or(state,
fn state ->
r_Prefix_Step3a_Noun(state)
end,
fn state ->
case (fn state ->
if state.vars[:is_noun], do: {:ok, state}, else: {:fail, state}
end).(state) do
{:ok, state} ->
r_Prefix_Step3b_Noun(state)
r -> r
end
end)
end,
fn state ->
case (fn state ->
if state.vars[:is_verb], do: {:ok, state}, else: {:fail, state}
end).(state) do
{:ok, state} ->
case (fn state ->
{:ok, snowball_try(state, fn state ->
r_Prefix_Step3_Verb(state)
end)}
end).(state) do
{:ok, state} ->
r_Prefix_Step4_Verb(state)
end
r -> r
end
end)
end
end
end)}
end).(state) do
{:ok, state} ->
{:ok, snowball_do_f(state, fn state ->
r_Normalize_post(state)
end)}
end
end
end
end
end
end
end
end
end