# Generated by Snowball.Generator — do not edit by hand. defmodule Text.Stemmer.Stemmers.Basque do @moduledoc """ Snowball stemmer for basque. Generated from the canonical Snowball algorithm source. """ alias Snowball.Runtime alias Snowball.Grouping # Groupings @g_v Grouping.from_string("aeiou") # Among tables @a_0 [ {"zlea", -1, 2, nil}, {"keria", -1, 1, nil}, {"la", -1, 1, nil}, {"era", -1, 1, nil}, {"dade", -1, 1, nil}, {"tade", -1, 1, nil}, {"date", -1, 1, nil}, {"tate", -1, 1, nil}, {"gi", -1, 1, nil}, {"ki", -1, 1, nil}, {"ik", -1, 1, nil}, {"lanik", 10, 1, nil}, {"rik", 10, 1, nil}, {"larik", 12, 1, nil}, {"ztik", 10, 1, nil}, {"go", -1, 1, nil}, {"ro", -1, 1, nil}, {"ero", 16, 1, nil}, {"to", -1, 1, nil} ] @a_1 [ {"ada", -1, 1, nil}, {"kada", 0, 1, nil}, {"anda", -1, 1, nil}, {"denda", -1, 1, nil}, {"gabea", -1, 1, nil}, {"kabea", -1, 1, nil}, {"aldea", -1, 1, nil}, {"kaldea", 6, 1, nil}, {"taldea", 6, 1, nil}, {"ordea", -1, 1, nil}, {"zalea", -1, 1, nil}, {"tzalea", 10, 1, nil}, {"gilea", -1, 1, nil}, {"emea", -1, 1, nil}, {"kumea", -1, 1, nil}, {"nea", -1, 1, nil}, {"enea", 15, 1, nil}, {"zionea", 15, 1, nil}, {"unea", 15, 1, nil}, {"gunea", 18, 1, nil}, {"pea", -1, 1, nil}, {"aurrea", -1, 1, nil}, {"tea", -1, 1, nil}, {"kotea", 22, 1, nil}, {"artea", 22, 1, nil}, {"ostea", 22, 1, nil}, {"etxea", -1, 1, nil}, {"ga", -1, 1, nil}, {"anga", 27, 1, nil}, {"gaia", -1, 1, nil}, {"aldia", -1, 1, nil}, {"taldia", 30, 1, nil}, {"handia", -1, 1, nil}, {"mendia", -1, 1, nil}, {"geia", -1, 1, nil}, {"egia", -1, 1, nil}, {"degia", 35, 1, nil}, {"tegia", 35, 1, nil}, {"nahia", -1, 1, nil}, {"ohia", -1, 1, nil}, {"kia", -1, 1, nil}, {"tokia", 40, 1, nil}, {"oia", -1, 1, nil}, {"koia", 42, 1, nil}, {"aria", -1, 1, nil}, {"karia", 44, 1, nil}, {"laria", 44, 1, nil}, {"taria", 44, 1, nil}, {"eria", -1, 1, nil}, {"keria", 48, 1, nil}, {"teria", 48, 1, nil}, {"garria", -1, 2, nil}, {"larria", -1, 1, nil}, {"kirria", -1, 1, nil}, {"duria", -1, 1, nil}, {"asia", -1, 1, nil}, {"tia", -1, 1, nil}, {"ezia", -1, 1, nil}, {"bizia", -1, 1, nil}, {"ontzia", -1, 1, nil}, {"ka", -1, 1, nil}, {"joka", 60, 3, nil}, {"aurka", 60, -1, nil}, {"ska", 60, 1, nil}, {"xka", 60, 1, nil}, {"zka", 60, 1, nil}, {"gibela", -1, 1, nil}, {"gela", -1, 1, nil}, {"kaila", -1, 1, nil}, {"skila", -1, 1, nil}, {"tila", -1, 1, nil}, {"ola", -1, 1, nil}, {"na", -1, 1, nil}, {"kana", 72, 1, nil}, {"ena", 72, 1, nil}, {"garrena", 74, 1, nil}, {"gerrena", 74, 1, nil}, {"urrena", 74, 1, nil}, {"zaina", 72, 1, nil}, {"tzaina", 78, 1, nil}, {"kina", 72, 1, nil}, {"mina", 72, 1, nil}, {"garna", 72, 1, nil}, {"una", 72, 1, nil}, {"duna", 83, 1, nil}, {"asuna", 83, 1, nil}, {"tasuna", 85, 1, nil}, {"ondoa", -1, 1, nil}, {"kondoa", 87, 1, nil}, {"ngoa", -1, 1, nil}, {"zioa", -1, 1, nil}, {"koa", -1, 1, nil}, {"takoa", 91, 1, nil}, {"zkoa", 91, 1, nil}, {"noa", -1, 1, nil}, {"zinoa", 94, 1, nil}, {"aroa", -1, 1, nil}, {"taroa", 96, 1, nil}, {"zaroa", 96, 1, nil}, {"eroa", -1, 1, nil}, {"oroa", -1, 1, nil}, {"osoa", -1, 1, nil}, {"toa", -1, 1, nil}, {"ttoa", 102, 1, nil}, {"ztoa", 102, 1, nil}, {"txoa", -1, 1, nil}, {"tzoa", -1, 1, nil}, {"ñoa", -1, 1, nil}, {"ra", -1, 1, nil}, {"ara", 108, 1, nil}, {"dara", 109, 1, nil}, {"liara", 109, 1, nil}, {"tiara", 109, 1, nil}, {"tara", 109, 1, nil}, {"etara", 113, 1, nil}, {"tzara", 109, 1, nil}, {"bera", 108, 1, nil}, {"kera", 108, 1, nil}, {"pera", 108, 1, nil}, {"ora", 108, 2, nil}, {"tzarra", 108, 1, nil}, {"korra", 108, 1, nil}, {"tra", 108, 1, nil}, {"sa", -1, 1, nil}, {"osa", 123, 1, nil}, {"ta", -1, 1, nil}, {"eta", 125, 1, nil}, {"keta", 126, 1, nil}, {"sta", 125, 1, nil}, {"dua", -1, 1, nil}, {"mendua", 129, 1, nil}, {"ordua", 129, 1, nil}, {"lekua", -1, 1, nil}, {"burua", -1, 1, nil}, {"durua", -1, 1, nil}, {"tsua", -1, 1, nil}, {"tua", -1, 1, nil}, {"mentua", 136, 1, nil}, {"estua", 136, 1, nil}, {"txua", -1, 1, nil}, {"zua", -1, 1, nil}, {"tzua", 140, 1, nil}, {"za", -1, 1, nil}, {"eza", 142, 1, nil}, {"eroza", 142, 1, nil}, {"tza", 142, 2, nil}, {"koitza", 145, 1, nil}, {"antza", 145, 1, nil}, {"gintza", 145, 1, nil}, {"kintza", 145, 1, nil}, {"kuntza", 145, 1, nil}, {"gabe", -1, 1, nil}, {"kabe", -1, 1, nil}, {"kide", -1, 1, nil}, {"alde", -1, 1, nil}, {"kalde", 154, 1, nil}, {"talde", 154, 1, nil}, {"orde", -1, 1, nil}, {"ge", -1, 1, nil}, {"zale", -1, 1, nil}, {"tzale", 159, 1, nil}, {"gile", -1, 1, nil}, {"eme", -1, 1, nil}, {"kume", -1, 1, nil}, {"ne", -1, 1, nil}, {"zione", 164, 1, nil}, {"une", 164, 1, nil}, {"gune", 166, 1, nil}, {"pe", -1, 1, nil}, {"aurre", -1, 1, nil}, {"te", -1, 1, nil}, {"kote", 170, 1, nil}, {"arte", 170, 1, nil}, {"oste", 170, 1, nil}, {"etxe", -1, 1, nil}, {"gai", -1, 1, nil}, {"di", -1, 1, nil}, {"aldi", 176, 1, nil}, {"taldi", 177, 1, nil}, {"geldi", 176, -1, nil}, {"handi", 176, 1, nil}, {"mendi", 176, 1, nil}, {"gei", -1, 1, nil}, {"egi", -1, 1, nil}, {"degi", 183, 1, nil}, {"tegi", 183, 1, nil}, {"nahi", -1, 1, nil}, {"ohi", -1, 1, nil}, {"ki", -1, 1, nil}, {"toki", 188, 1, nil}, {"oi", -1, 1, nil}, {"goi", 190, 1, nil}, {"koi", 190, 1, nil}, {"ari", -1, 1, nil}, {"kari", 193, 1, nil}, {"lari", 193, 1, nil}, {"tari", 193, 1, nil}, {"garri", -1, 2, nil}, {"larri", -1, 1, nil}, {"kirri", -1, 1, nil}, {"duri", -1, 1, nil}, {"asi", -1, 1, nil}, {"ti", -1, 1, nil}, {"ontzi", -1, 1, nil}, {"ñi", -1, 1, nil}, {"ak", -1, 1, nil}, {"ek", -1, 1, nil}, {"tarik", -1, 1, nil}, {"gibel", -1, 1, nil}, {"ail", -1, 1, nil}, {"kail", 209, 1, nil}, {"kan", -1, 1, nil}, {"tan", -1, 1, nil}, {"etan", 212, 1, nil}, {"en", -1, 4, nil}, {"ren", 214, 2, nil}, {"garren", 215, 1, nil}, {"gerren", 215, 1, nil}, {"urren", 215, 1, nil}, {"ten", 214, 4, nil}, {"tzen", 214, 4, nil}, {"zain", -1, 1, nil}, {"tzain", 221, 1, nil}, {"kin", -1, 1, nil}, {"min", -1, 1, nil}, {"dun", -1, 1, nil}, {"asun", -1, 1, nil}, {"tasun", 226, 1, nil}, {"aizun", -1, 1, nil}, {"ondo", -1, 1, nil}, {"kondo", 229, 1, nil}, {"go", -1, 1, nil}, {"ngo", 231, 1, nil}, {"zio", -1, 1, nil}, {"ko", -1, 1, nil}, {"trako", 234, 5, nil}, {"tako", 234, 1, nil}, {"etako", 236, 1, nil}, {"eko", 234, 1, nil}, {"tariko", 234, 1, nil}, {"sko", 234, 1, nil}, {"tuko", 234, 1, nil}, {"minutuko", 241, 6, nil}, {"zko", 234, 1, nil}, {"no", -1, 1, nil}, {"zino", 244, 1, nil}, {"ro", -1, 1, nil}, {"aro", 246, 1, nil}, {"igaro", 247, -1, nil}, {"taro", 247, 1, nil}, {"zaro", 247, 1, nil}, {"ero", 246, 1, nil}, {"giro", 246, 1, nil}, {"oro", 246, 1, nil}, {"oso", -1, 1, nil}, {"to", -1, 1, nil}, {"tto", 255, 1, nil}, {"zto", 255, 1, nil}, {"txo", -1, 1, nil}, {"tzo", -1, 1, nil}, {"gintzo", 259, 1, nil}, {"ño", -1, 1, nil}, {"zp", -1, 1, nil}, {"ar", -1, 1, nil}, {"dar", 263, 1, nil}, {"behar", 263, 1, nil}, {"zehar", 263, -1, nil}, {"liar", 263, 1, nil}, {"tiar", 263, 1, nil}, {"tar", 263, 1, nil}, {"tzar", 263, 1, nil}, {"or", -1, 2, nil}, {"kor", 271, 1, nil}, {"os", -1, 1, nil}, {"ket", -1, 1, nil}, {"du", -1, 1, nil}, {"mendu", 275, 1, nil}, {"ordu", 275, 1, nil}, {"leku", -1, 1, nil}, {"buru", -1, 2, nil}, {"duru", -1, 1, nil}, {"tsu", -1, 1, nil}, {"tu", -1, 1, nil}, {"tatu", 282, 4, nil}, {"mentu", 282, 1, nil}, {"estu", 282, 1, nil}, {"txu", -1, 1, nil}, {"zu", -1, 1, nil}, {"tzu", 287, 1, nil}, {"gintzu", 288, 1, nil}, {"z", -1, 1, nil}, {"ez", 290, 1, nil}, {"eroz", 290, 1, nil}, {"tz", 290, 1, nil}, {"koitz", 293, 1, nil} ] @a_2 [ {"idea", -1, 1, nil}, {"bidea", 0, 1, nil}, {"kidea", 0, 1, nil}, {"pidea", 0, 1, nil}, {"kundea", -1, 1, nil}, {"galea", -1, 1, nil}, {"tailea", -1, 1, nil}, {"tzailea", -1, 1, nil}, {"gunea", -1, 1, nil}, {"kunea", -1, 1, nil}, {"tzaga", -1, 1, nil}, {"gaia", -1, 1, nil}, {"aldia", -1, 1, nil}, {"taldia", 12, 1, nil}, {"karia", -1, 1, nil}, {"garria", -1, 2, nil}, {"karria", -1, 1, nil}, {"ka", -1, 1, nil}, {"tzaka", 17, 1, nil}, {"la", -1, 1, nil}, {"mena", -1, 1, nil}, {"pena", -1, 1, nil}, {"kina", -1, 1, nil}, {"ezina", -1, 1, nil}, {"tezina", 23, 1, nil}, {"kuna", -1, 1, nil}, {"tuna", -1, 1, nil}, {"kizuna", -1, 1, nil}, {"era", -1, 1, nil}, {"bera", 28, 1, nil}, {"arabera", 29, -1, nil}, {"kera", 28, 1, nil}, {"pera", 28, 1, nil}, {"orra", -1, 1, nil}, {"korra", 33, 1, nil}, {"dura", -1, 1, nil}, {"gura", -1, 1, nil}, {"kura", -1, 1, nil}, {"tura", -1, 1, nil}, {"eta", -1, 1, nil}, {"keta", 39, 1, nil}, {"gailua", -1, 1, nil}, {"eza", -1, 1, nil}, {"erreza", 42, 1, nil}, {"tza", -1, 2, nil}, {"gaitza", 44, 1, nil}, {"kaitza", 44, 1, nil}, {"kuntza", 44, 1, nil}, {"ide", -1, 1, nil}, {"bide", 48, 1, nil}, {"kide", 48, 1, nil}, {"pide", 48, 1, nil}, {"kunde", -1, 1, nil}, {"tzake", -1, 1, nil}, {"tzeke", -1, 1, nil}, {"le", -1, 1, nil}, {"gale", 55, 1, nil}, {"taile", 55, 1, nil}, {"tzaile", 55, 1, nil}, {"gune", -1, 1, nil}, {"kune", -1, 1, nil}, {"tze", -1, 1, nil}, {"atze", 61, 1, nil}, {"gai", -1, 1, nil}, {"aldi", -1, 1, nil}, {"taldi", 64, 1, nil}, {"ki", -1, 1, nil}, {"ari", -1, 1, nil}, {"kari", 67, 1, nil}, {"lari", 67, 1, nil}, {"tari", 67, 1, nil}, {"etari", 70, 1, nil}, {"garri", -1, 2, nil}, {"karri", -1, 1, nil}, {"arazi", -1, 1, nil}, {"tarazi", 74, 1, nil}, {"an", -1, 1, nil}, {"ean", 76, 1, nil}, {"rean", 77, 1, nil}, {"kan", 76, 1, nil}, {"etan", 76, 1, nil}, {"atseden", -1, -1, nil}, {"men", -1, 1, nil}, {"pen", -1, 1, nil}, {"kin", -1, 1, nil}, {"rekin", 84, 1, nil}, {"ezin", -1, 1, nil}, {"tezin", 86, 1, nil}, {"tun", -1, 1, nil}, {"kizun", -1, 1, nil}, {"go", -1, 1, nil}, {"ago", 90, 1, nil}, {"tio", -1, 1, nil}, {"dako", -1, 1, nil}, {"or", -1, 1, nil}, {"kor", 94, 1, nil}, {"tzat", -1, 1, nil}, {"du", -1, 1, nil}, {"gailu", -1, 1, nil}, {"tu", -1, 1, nil}, {"atu", 99, 1, nil}, {"aldatu", 100, 1, nil}, {"tatu", 100, 1, nil}, {"baditu", 99, -1, nil}, {"ez", -1, 1, nil}, {"errez", 104, 1, nil}, {"tzez", 104, 1, nil}, {"gaitz", -1, 1, nil}, {"kaitz", -1, 1, 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, pV: 0}} 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_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 r_adjetiboak(%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 -> r_RV(state) end).(state) do {:ok, state} -> {:ok, Runtime.slice_del(state)} r -> r end 2 -> {:ok, Runtime.slice_from(state, "z")} _ -> {:ok, state} end end end).() end defp r_izenak(%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 -> r_RV(state) 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} -> {:ok, Runtime.slice_del(state)} r -> r end 3 -> {:ok, Runtime.slice_from(state, "jok")} 4 -> case (fn state -> r_R1(state) end).(state) do {:ok, state} -> {:ok, Runtime.slice_del(state)} r -> r end 5 -> {:ok, Runtime.slice_from(state, "tra")} 6 -> {:ok, Runtime.slice_from(state, "minutu")} _ -> {:ok, state} end end end).() end defp r_aditzak(%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 -> r_RV(state) 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} -> {:ok, Runtime.slice_del(state)} r -> r end _ -> {:ok, state} end end end).() end defp r_R1(%Runtime{} = state) do if state.vars[:p1] <= state.cursor, do: {:ok, state}, else: {:fail, state} end defp r_R2(%Runtime{} = state) do if state.vars[:p2] <= state.cursor, do: {:ok, state}, else: {:fail, state} end defp r_RV(%Runtime{} = state) do if state.vars[:pV] <= state.cursor, do: {:ok, state}, else: {:fail, state} end defp r_mark_regions(%Runtime{} = state) do case (fn state -> {:ok, put_in(state.vars[:pV], state.limit)} end).(state) do {:ok, state} -> 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} -> case (fn state -> {:ok, snowball_do_f(state, fn state -> case (fn state -> snowball_or(state, fn state -> case (fn state -> lift(state, Runtime.in_grouping(state, @g_v)) end).(state) do {:ok, state} -> snowball_or(state, fn state -> case (fn state -> lift(state, Runtime.out_grouping(state, @g_v)) end).(state) do {:ok, state} -> case Runtime.go_out_grouping(state, @g_v) do :fail -> {:fail, state} %Runtime{} = s -> next_codepoint(s) end r -> r end end, fn state -> case (fn state -> lift(state, Runtime.in_grouping(state, @g_v)) 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) r -> r end end, fn state -> case (fn state -> lift(state, Runtime.out_grouping(state, @g_v)) end).(state) do {:ok, state} -> snowball_or(state, fn state -> case (fn state -> lift(state, Runtime.out_grouping(state, @g_v)) end).(state) do {:ok, state} -> case Runtime.go_out_grouping(state, @g_v) do :fail -> {:fail, state} %Runtime{} = s -> next_codepoint(s) end r -> r end end, fn state -> case (fn state -> lift(state, Runtime.in_grouping(state, @g_v)) end).(state) do {:ok, state} -> next_codepoint(state) r -> r end end) r -> r end end) end).(state) do {:ok, state} -> {:ok, put_in(state.vars[:pV], state.cursor)} r -> r end end)} end).(state) do {:ok, state} -> {:ok, snowball_do_f(state, 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 (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} -> 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 r -> r end end)} end end end end end defp r_stem(%Runtime{} = state) do case (fn state -> {:ok, snowball_do_f(state, fn state -> r_mark_regions(state) end)} end).(state) do {:ok, 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 -> (fn loop_fn -> loop_fn.(loop_fn, state) end).(fn loop_fn, state -> case (fn state -> r_aditzak(state) end).(state) do {:ok, s} -> loop_fn.(loop_fn, s) {:fail, s} -> {:ok, %{s | cursor: state.cursor}} end end) end).(state) do {:ok, state} -> case (fn state -> (fn loop_fn -> loop_fn.(loop_fn, state) end).(fn loop_fn, state -> case (fn state -> r_izenak(state) end).(state) do {:ok, s} -> loop_fn.(loop_fn, s) {:fail, s} -> {:ok, %{s | cursor: state.cursor}} end end) end).(state) do {:ok, state} -> {:ok, snowball_do_b(state, fn state -> r_adjetiboak(state) end)} end end end).(state) {tag, %{s | cursor: old_cursor, limit_backward: old_lb}} end).(state) end end end