-module(sift@int). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "src/sift/int.gleam"). -export([min/2, max/2, between/3, positive/1, non_negative/1, negative/1, divisible_by/2, one_of/2]). -if(?OTP_RELEASE >= 27). -define(MODULEDOC(Str), -moduledoc(Str)). -define(DOC(Str), -doc(Str)). -else. -define(MODULEDOC(Str), -compile([])). -define(DOC(Str), -compile([])). -endif. ?MODULEDOC(" Integer validators — range, positivity, and membership checks.\n"). -file("src/sift/int.gleam", 4). ?DOC(" Value must be >= n\n"). -spec min(integer(), DZR) -> fun((integer()) -> {ok, integer()} | {error, DZR}). min(N, Msg) -> fun(Value) -> case Value >= N of true -> {ok, Value}; false -> {error, Msg} end end. -file("src/sift/int.gleam", 14). ?DOC(" Value must be <= n\n"). -spec max(integer(), DZU) -> fun((integer()) -> {ok, integer()} | {error, DZU}). max(N, Msg) -> fun(Value) -> case Value =< N of true -> {ok, Value}; false -> {error, Msg} end end. -file("src/sift/int.gleam", 30). ?DOC( " Value must be between lo and hi (inclusive).\n" "\n" " ```gleam\n" " let validator = int.between(1, 100, \"out of range\")\n" " validator(50) // -> Ok(50)\n" " validator(200) // -> Error(\"out of range\")\n" " ```\n" ). -spec between(integer(), integer(), DZX) -> fun((integer()) -> {ok, integer()} | {error, DZX}). between(Lo, Hi, Msg) -> fun(Value) -> case (Value >= Lo) andalso (Value =< Hi) of true -> {ok, Value}; false -> {error, Msg} end end. -file("src/sift/int.gleam", 40). ?DOC(" Value must be > 0\n"). -spec positive(EAA) -> fun((integer()) -> {ok, integer()} | {error, EAA}). positive(Msg) -> fun(Value) -> case Value > 0 of true -> {ok, Value}; false -> {error, Msg} end end. -file("src/sift/int.gleam", 50). ?DOC(" Value must be >= 0\n"). -spec non_negative(EAD) -> fun((integer()) -> {ok, integer()} | {error, EAD}). non_negative(Msg) -> fun(Value) -> case Value >= 0 of true -> {ok, Value}; false -> {error, Msg} end end. -file("src/sift/int.gleam", 76). ?DOC( " Value must be < 0.\n" "\n" " ```gleam\n" " let validator = int.negative(\"must be negative\")\n" " validator(-1) // -> Ok(-1)\n" " validator(0) // -> Error(\"must be negative\")\n" " ```\n" ). -spec negative(EAK) -> fun((integer()) -> {ok, integer()} | {error, EAK}). negative(Msg) -> fun(Value) -> case Value < 0 of true -> {ok, Value}; false -> {error, Msg} end end. -file("src/sift/int.gleam", 92). ?DOC( " Value must be divisible by n.\n" "\n" " ```gleam\n" " let validator = int.divisible_by(3, \"must be divisible by 3\")\n" " validator(9) // -> Ok(9)\n" " validator(7) // -> Error(\"must be divisible by 3\")\n" " ```\n" ). -spec divisible_by(integer(), EAN) -> fun((integer()) -> {ok, integer()} | {error, EAN}). divisible_by(N, Msg) -> fun(Value) -> case (case N of 0 -> 0; Gleam@denominator -> Value rem Gleam@denominator end) =:= 0 of true -> {ok, Value}; false -> {error, Msg} end end. -file("src/sift/int.gleam", 101). -spec list_contains(list(integer()), integer()) -> boolean(). list_contains(Items, Target) -> case Items of [] -> false; [First | Rest] -> case First =:= Target of true -> true; false -> list_contains(Rest, Target) end end. -file("src/sift/int.gleam", 60). ?DOC(" Value must be one of the given values\n"). -spec one_of(list(integer()), EAH) -> fun((integer()) -> {ok, integer()} | {error, EAH}). one_of(Values, Msg) -> fun(Value) -> case list_contains(Values, Value) of true -> {ok, Value}; false -> {error, Msg} end end.