uef-lib is a Useful Erlang Functions Library that provides modules for manipulating lists, binaries, maps, numbers, date and time. It can be used in OTP applications and contains some functions optimized for performance in specific cases (e.g. for file I/O operations or binary transformations).
Erlang/OTP 19 or higher is required.
- Installation
- Modules
- Documentation
- Module
uef_bin- uef_bin:chomp/1
- uef_bin:binary_join/2
- uef_bin:repeat/2
- uef_bin:reverse/1
- uef_bin:reverse_utf8/1
- uef_bin:split/2
- uef_bin:split/3
- uef_bin:replace/3
- uef_bin:replace_chars/3
- uef_bin:random_latin_binary/2
- uef_bin:random_binary_from_chars/2
- uef_bin:numeric_prefix/1
- uef_bin:strip_left/2
- uef_bin:strip_right/2
- uef_bin:strip_both/2
- Module
uef_crypt - Module
uef_encode - Module
uef_file - Module
uef_format - Module
uef_lists - Module
uef_maps - Module
uef_num - Module
uef_time- uef_time:add_seconds/1
- uef_time:add_seconds/2
- uef_time:add_minutes/1
- uef_time:add_minutes/2
- uef_time:add_hours/1
- uef_time:add_hours/2
- uef_time:add_days/1
- uef_time:add_days/2
- uef_time:add_weeks/1
- uef_time:add_weeks/2
- uef_time:add_months/1
- uef_time:add_months/2
- uef_time:add_years/1
- uef_time:add_years/2
- uef_time:add_time/1
- uef_time:add_time/2
- uef_time:today/0
- uef_time:tomorrow/0
- uef_time:yesterday/0
- uef_time:unix_time/0
- uef_time:unix_time/1
- uef_time:days_diff/1
- uef_time:days_diff/2
- uef_time:seconds_diff/1
- uef_time:seconds_diff/2
- Module
- Build
- Test and dialyze
- Build documentation
- Contributing
-
uef_bin - for binaries.
-
uef_crypt - some crypto functions.
-
uef_encode - working with encodings.
-
uef_file - working with files.
-
uef_format - formatting numbers.
-
uef_lists - lists transformations.
-
uef_maps - functions for maps processing.
-
uef_num - helpful functions for numbers.
-
uef_time - datetime functions.
uef_bin:chomp(Binary1 :: binary()) -> Binary2 :: binary().Removes all trailing \n and \r characters from Binary1.
Examples:
> uef_bin:chomp(<<"string\r\n">>).
<<"string">>
> uef_bin:chomp(<<"string\r\n\r\n">>).
<<"string">>
> uef_bin:chomp(<<"string\n\n\n\n">>).
<<"string">>
> uef_bin:chomp(<<"string\r\r\r\r">>).
<<"string">>uef_bin:binary_join(ListOfBinaries, Separator) -> Binary.Joins a list of binaries with separator into a single binary. Returns binary.
Example:
> uef_bin:binary_join([<<"www">>, <<"example">>, <<"com">>], <<".">>).
<<"www.example.com">>uef_bin:repeat(Binary1, N) -> Binary2.Returns binary Binary2 consisting of Binary1 repeated N times.
Examples:
> uef_bin:repeat(<<"a">>, 10).
<<"aaaaaaaaaa">>
> uef_bin:repeat(<<"0">>, 3).
<<"000">>
> uef_bin:repeat(<<0>>, 3).
<<0,0,0>>
> uef_bin:repeat(<<1,1>>, 3).
<<1,1,1,1,1,1>>
> uef_bin:repeat(<<"abc">>, 3).
<<"abcabcabc">>uef_bin:reverse(Binary1) -> Binary2.Returns a binary in reverse byte order.
Note: this function is not intended to work with UTF-8 binary strings. To get a binary in reverse character order, use uef_bin:reverse_utf8/1 instead.
Examples:
> uef_bin:reverse(<<"ABCDEFGH">>).
<<"HGFEDCBA">>
> uef_bin:reverse(<<1,2,3,4,5>>).
<<5,4,3,2,1>>
> uef_bin:reverse(<<>>).
<<>>uef_bin:reverse_utf8(UTF8_Binary1) -> UTF8_Binary2.Returns a binary in reverse character order. Intended to work with UTF-8 binary strings.
Examples:
> uef_bin:reverse_utf8(<<"ABCDEFGH">>).
<<"HGFEDCBA">>
> uef_bin:reverse_utf8(<<1,2,3,4,5>>).
<<5,4,3,2,1>>
> uef_bin:reverse_utf8(<<"die Straße"/utf8>>).
<<"eßartS eid"/utf8>>
> uef_bin:reverse_utf8(<<"АБВГДЕЁЖ"/utf8>>) =:= <<"ЖЁЕДГВБА"/utf8>>.
true
> uef_bin:reverse_utf8(<<1, 2, 3, "АБВГДЕЁЖ"/utf8, 4, 5, 6, 7>>) =:= <<7, 6, 5, 4, "ЖЁЕДГВБА"/utf8, 3, 2, 1>>.
true
> uef_bin:reverse_utf8(<<"這條街"/utf8>>) =:= <<"街條這"/utf8>>.
true
> uef_bin:reverse_utf8(<<"こんにちは"/utf8>>) =:= <<"はちにんこ"/utf8>>.
trueuef_bin:split(Binary, Splitter) -> ListOfBinaries.Splits binary Binary with splitter Splitter into a list of binaries. Works as binary:split/2 but is more performant in simple cases.
Examples:
> uef_bin:split(<<".www.example.com.">>, <<".">>).
[<<>>,<<"www">>,<<"example">>,<<"com">>,<<>>]
> uef_bin:split(<<"www.example.com">>, <<".">>).
[<<"www">>,<<"example">>,<<"com">>]
> uef_bin:split(<<"www.example.com">>, <<"A">>).
[<<"www.example.com">>]uef_bin:split(Binary, Splitter, 'trim_all') -> ListOfBinaries.Splits binary Binary with splitter Splitter into a list of binaries. Works as uef_bin:split/2 but removes all epmty (<<>>) chunks. It can be used in simple cases instead of binary:split/3 for the reason that it’s more performant.
Example:
> uef_bin:split(<<"..www.example.com.">>, <<".">>, trim_all).
[<<"www">>,<<"example">>,<<"com">>]uef_bin:replace(Binary1, Chars, OtherChars) -> Binary2.Replaces chars Chars with other chars OtherChars in binary Binary1 and returns another binary Binary2. Works as binary:replace/3 but more permormant and can be used in simple cases.
Examples:
> uef_bin:replace(<<"abcdefgbc">>, <<"bc">>, <<"ZZ">>).
<<"aZZdefgZZ">>
> uef_bin:replace(<<"abcdefgbc">>, <<"d">>, <<"ZZ">>).
<<"abcZZefgbc">>uef_bin:replace_chars(Binary1, ListOfCharsToReplace, OtherChars) -> Binary2.Replaces chars inluded in list ListOfCharsToReplace with other chars OtherChars in binary Binary1 and returns another binary Binary2.
Examples:
uef_bin:replace_chars(<<"..www.example.com.">>, [<<".">>], <<>>).
<<"wwwexamplecom">>
uef_bin:replace_chars(<<"..www.example.com.">>, [<<".">>, <<"w">>], <<>>).
<<"examplecom">>uef_bin:random_latin_binary(Length, CaseFlag) -> RandomLatinBinary.Returns a random binary of size Length consisting of latins [a-zA-Z] and digits [0-9]. The second argument CaseFlag corresponds to a letter case, an atom 'lower', 'upper' or 'any'.
Examples:
> uef_bin:random_latin_binary(10, lower).
<<"n0ui89sfsb">>
> uef_bin:random_latin_binary(10, upper).
<<"S11Y3DHEJI">>
> uef_bin:random_latin_binary(10, any).
<<"mTa9Lj7KUN">>uef_bin:random_binary_from_chars(Length, Chars) -> RandomCharsBinary.Generates and returns a binary of size Length which consists of the given characters Chars.
Example:
> uef_bin:random_binary_from_chars(16, <<"ErlangForever">>).
<<"eFveerorreravgng">>uef_bin:numeric_prefix(Binary) -> DigitsOnlyOrEmptyBinary.Returns new binary DigitsOnlyBinary which consists of digits [0-9] wich are at the beginning in the given binary Binary. If Binary does not begin with digit, this function returns empty binary (<<>>).
Examples:
> uef_bin:numeric_prefix(<<"3456sld1knskjd">>).
<<"3456">>
> uef_bin:numeric_prefix(<<"ddd3456sld1knskjd">>).
<<>>uef_bin:strip_left(Binary1, Chars) -> Binary2.Types:
Binary1 :: binary().
Chars :: binary() | integer().
Binary2 :: binary().Removes leading Chars from Binary1 and returns Binary2.
Examples:
> uef_bin:strip_left(<<"www.example.com">>, <<"w">>).
<<".example.com">>
> uef_bin:strip_left(<<"www.example.com">>, <<"ww">>).
<<"w.example.com">>
> uef_bin:strip_left(<<11, 11, 11, 12, 13, 14>>, 11).
<<12,13,14>>
> uef_bin:strip_left(<<"ААААБВГДЕЁЖ"/utf8>>, <<"А"/utf8>>) =:= <<"БВГДЕЁЖ"/utf8>>.
true
> uef_bin:strip_left(<<"這這這這條街"/utf8>>, <<"這"/utf8>>) =:= <<"條街"/utf8>>.
trueuef_bin:strip_right(Binary1, Chars) -> Binary2.Types:
Binary1 :: binary().
Chars :: binary() | integer().
Binary2 :: binary().Removes trailing Chars from Binary1 and returns Binary2.
Examples:
> uef_bin:strip_right(<<"example.comwww">>, <<"w">>).
<<"example.com">>
> uef_bin:strip_right(<<"example.comwww">>, <<"ww">>).
<<"example.comw">>
> uef_bin:strip_right(<<1, 2, 3, 4, 5, 5, 5>>, 5).
<<1,2,3,4>>
> uef_bin:strip_right(<<"АБВГДЕЁЖЖЖЖ"/utf8>>, <<"Ж"/utf8>>) =:= <<"АБВГДЕЁ"/utf8>>.
true
> uef_bin:strip_right(<<"這條街街街街"/utf8>>, <<"街"/utf8>>) =:= <<"這條"/utf8>>.
trueuef_bin:strip_both(Binary1, Chars) -> Binary2.Types:
Binary1 :: binary().
Chars :: binary() | integer().
Binary2 :: binary().Removes leading and trailing Chars from Binary1 and returns Binary2.
Examples:
> uef_bin:strip_both(<<"www.example.www">>, <<"w">>).
<<".example.">>
> uef_bin:strip_both(<<"com.example.com">>, <<"com">>).
<<".example.">>
> uef_bin:strip_both(<<5,5,5, 1,2,3,4, 5,5,5>>, 5).
<<1,2,3,4>>
> uef_bin:strip_both(<<"ЖЖЖЖАБВГДЕЁЖЖЖЖ"/utf8>>, <<"Ж"/utf8>>) =:= <<"АБВГДЕЁ"/utf8>>.
true
> uef_bin:strip_both(<<"街街街街這條街街街街"/utf8>>, <<"街"/utf8>>) =:= <<"這條"/utf8>>.
trueuef_crypt:md5_hex(IoData) -> Binary.Returns binary Binary in hexadecimal form of md5 hash of the argument IoData.
Examples:
> uef_crypt:md5_hex("abcd").
<<"e2fc714c4727ee9395f324cd2e7f331f">>
> uef_crypt:md5_hex(<<"привет"/utf8>>).
<<"608333adc72f545078ede3aad71bfe74">>
> uef_crypt:md5_hex(["how", ["is", ["it"]], "going", $?]).
<<"eb89df06495cef83e3ec185aefe81d0e">>uef_encode:html_encode_bin(Html) -> EncodedBinary.Takes argument Html, replaces some unsafe symbols with their appropriate HTML entities and returns binary.
Examples:
> uef_encode:html_encode_bin("<>&©\n™").
<<"<>&©<br/>™">>
> uef_encode:html_encode_bin("♦±Σ").
<<"♦±Σ">>uef_encode:html_encode_list(Html) -> EncodedList.Takes argument Html, replaces some unsafe symbols with their appropriate HTML entities and returns list of binaries.
Examples:
> uef_encode:html_encode_list("<>&©\n™").
[<<"<">>,<<">">>,<<"&">>,<<"©">>,<<"<br/>">>,<<"™">>]
> uef_encode:html_encode_list("♦±Σ").
[<<"♦">>,<<"±">>,<<"Σ">>]uef_encode:win_to_utf8(Binary1251) -> BinaryUtf8.Converts cp1251 binary to utf-8 binary.
Example:
file_1251_to_utf8() ->
File1251 = "1251.txt",
FileUtf8 = "utf8.txt",
{ok, Bin1251} = file:read_file(File1251),
BinUtf8 = uef_encode:win_to_utf8(Bin1251), %converting
file:write_file(FileUtf8, BinUtf8).uef_file:read_file_info_fast(Filename) -> {ok, FileInfo} | {error, Reason}.Retrieves information about local file. Returns {ok, FileInfo} if successful, otherwise {error, Reason}. Works as file:read_file_info/2 but optimized for local files. This is a wrapper of:
file:read_file_info(Filename, [raw, {time, posix}]).
uef_file:read_file_fast(Filename) -> {ok, BinaryData} | {error, Reason}.Reads contents of local file Filename and returns {ok, BinaryData}, where BinaryData is a binary data object that contains the contents of Filename, or {error, Reason} if an error occurs. This function is optimized for reading contents of local files, as no Erlang process is used. It calls file:open/2 with options [read, raw, binary].
uef_format:format_bytes(Bytes) -> FormattedBytes.The same as uef_format:format_bytes(Bytes, #{}). See uef_format:format_bytes/2 docs.
Examples:
> uef_format:format_bytes(1024).
<<"1KB">>
> uef_format:format_bytes(1000).
<<"0KB">>
> uef_format:format_bytes(1048576).
<<"1MB">>
> uef_format:format_bytes(10485760).
<<"10MB">>uef_format:format_bytes(Bytes, Options) -> FormattedBytes.Types:
Bytes :: integer().
Options :: #{
units => Units,
base => Base,
to_type => ToType,
sep => Separator
}.
Units :: auto | MultiUnits.
MultiUnits :: 'KB' | 'MB' | 'GB' | 'TB' | 'PB' | 'EB' | 'ZB' | 'YB'.
Base :: 2 | 10.
ToType :: bin | int.
Separator :: binary().
FormattedBytes :: binary() | integer() | {integer(), MultiUnits}.Default Options:
#{ units => auto, base => 2, to_type => bin, sep => <<>> }.Converts bytes Bytes to multiples of bytes. The datatype of the return value depends on ToType and Units:
-
if
ToTypeisbin, it returnsbinary(); -
if
ToTypeisint, it returnsinteger(); -
if
ToTypeisintandUnitsisauto, tuple{integer(), MultiUnits}is returned.
The value of Base affects the conversion of Bytes to multiples:
-
Base = 2means that1KB = 1024 bytes,1MB = 1048576 bytes, …; -
Base = 10means that1KB = 1000 bytes,1MB = 1000000 bytes, …
If the value of Units is auto, bytes are converted to the most reasonable multiples of bytes.
Separator is a separator between integer value and Units. This option affects the result when ToType is bin.
Examples:
> uef_format:format_bytes(1000000, #{units => auto, base => 2}).
<<"976KB">>
> uef_format:format_bytes(1048576, #{units => auto, base => 2}).
<<"1MB">>
> uef_format:format_bytes(1048576, #{units => 'KB', base => 2}).
<<"1024KB">>
> uef_format:format_bytes(1048576, #{units => 'KB', base => 10}).
<<"1048KB">>
> uef_format:format_bytes(1048576, #{units => auto, base => 2, to_type => int}).
{1,'MB'}
> uef_format:format_bytes(1048576, #{units => 'KB', base => 2, to_type => int}).
1024
> uef_format:format_bytes(1048576, #{units => 'KB', to_type => bin, sep => <<" ">>}).
<<"1024 KB">>
> uef_format:format_bytes(1048576, #{units => 'KB', to_type => bin, sep => <<"|">>}).
<<"1024|KB">>uef_format:format_number(Number, Precision, Decimals) -> FormattedNumber.The same as uef_format:format_number/4 with #{} as the forth argument. See uef_format:format_number/4 docs.
Examples:
> uef_format:format_number(199.4567, 2, 3).
<<"199.460">>
>uef_format:format_number(199.4567, 1, 3).
<<"199.500">>
> uef_format:format_number(199.4567, 0, 4).
<<"199.0000">>
> uef_format:format_number(199.4567, -1, 2).
<<"200.00">>uef_format:format_number(Number, Precision, Decimals, Options) -> FormattedNumber.Formats Number by adding thousands separator between each set of 3 digits to the left of the decimal point, substituting Decimals for the decimal point, and rounding to the specified Precision. Returns a binary value.
Types:
Number :: number().
Precision :: integer().
Decimals :: non_neg_integer().
FormattedNumber :: binary().Options is a map:
#{
thousands_sep => binary() | string(), % Thousands separator
decimal_point => binary() | string(), % Decimal point
cur_symbol => binary() | string(), %% Currency symbol
cur_pos => 'left' | 'right', % Currency position against price (left or right)
cur_sep => binary() | string() % Separator between currency and price
}Note: to get maximum performance use binary values for options thousands_sep, decimal_point, cur_symbol and cur_sep instead of strings.
Examples:
> uef_format:format_number(1234567890.4567, 2, 2, #{}).
<<"1234567890.46">>
> uef_format:format_number(1234567890.4567, 2, 2, #{thousands_sep => ",", cur_symbol => "$"}).
<<"$1,234,567,890.46">>
> uef_format:format_number(1234567890.4567, 2, 2, #{
thousands_sep => ",",
cur_symbol => "USD",
cur_sep => " ", % whitespace
cur_pos => right}).
<<"1,234,567,890.46 USD">>
> uef_format:format_number(1234567890.4567, 2, 4, #{
thousands_sep => ",",
decimal_point => "==",
cur_symbol => "USD",
cur_sep => " ",
cur_pos => left}).
<<"USD 1,234,567,890==4600">>
> uef_format:format_number(1234567890.4567, 2, 4, #{
thousands_sep => <<",">>, % binary()
decimal_point => <<".">>, % binary()
cur_symbol => <<"USD">>, % binary()
cur_sep => <<" ">>, % binary()
cur_pos => left}).
<<"USD 1,234,567,890.4600">>uef_format:format_price(Number) -> FormattedPrice.Formats Number in price-like style. Returns a binary containing FormattedPrice formatted with a precision of 2 and decimal digits of 2.
The same as uef_format:format_price/2 with a precision of 2 as the second argument. See uef_format:format_price/2 docs.
Examples:
> uef_format:format_price(199).
<<"199.00">>
> uef_format:format_price(199.9876).
<<"199.99">>uef_format:format_price(Number, Precision) -> FormattedPrice.Formats Number in price-like style. Returns a binary containing FormattedPrice formatted with a specified precision as the second argument and decimal digits of 2.
The same as uef_format:format_price/3 with #{} as the third argument. See uef_format:format_price/3 docs.
Example:
> uef_format:format_price(1999.9876, 4).
<<"1999.99">>uef_format:format_price(Number, Precision, CurrencySymbol_OR_Options) -> FormattedPrice.Formats Number in price-like style. Returns a binary containing FormattedPrice formatted with a specified precision as the second argument, decimal digits of 2, and with currency symbol (or options) as the third argument.
If CurrencySymbol_OR_Options is a map the functions works as uef_format:format_number/4 with decimal digits of 2 as the third argument and with options as the forth one.
If CurrencySymbol_OR_Options is a binary or a string, the corresponding currency symbol is added to the left.
Examples:
> uef_format:format_price(1000.8767, 4, #{}).
<<"1000.88">>
> uef_format:format_price(1000.8767, 4, #{
thousands_sep => ",",
cur_symbol => "USD",
cur_sep => " ",
cur_pos => right}).
<<"1,000.88 USD">>
> uef_format:format_price(1000.8767, 4, #{
thousands_sep => ",",
cur_symbol => <<"руб."/utf8>>,
cur_sep => " ",
cur_pos => right}).
<<49,44,48,48,48,46,56,56,32,209,128,209,131,208,177,46>> % <<"1,000.88 руб."/utf8>>.
> uef_format:format_price(1000.8767, 4, "$").
<<"$1000.88">>
> uef_format:format_price(99.999, 2, "$").
<<"$100.00">>
> uef_format:format_price(99.99, 2, "$").
<<"$99.99">>
> uef_format:format_price(99.99, 2, <<"€"/utf8>>).
<<226,130,172,57,57,46,57,57>> % <<"€99.99"/utf8>>uef_lists:split_list_into_chunks(List, MaxLen) -> [List1, List2, ..., ListN].Splits List into list of lists [List1, List2, …, ListN] where List1, List2, …, ListN are lists with maximum MaxLen elements.
Examples:
> uef_lists:split_list_into_chunks([1,2,3,4,5,6,7,8], 1).
[[1],[2],[3],[4],[5],[6],[7],[8]]
> uef_lists:split_list_into_chunks([1,2,3,4,5,6,7,8], 2).
[[1,2],[3,4],[5,6],[7,8]]
> uef_lists:split_list_into_chunks([1,2,3,4,5,6,7,8], 3).
[[1,2,3],[4,5,6],[7,8]]
> uef_lists:split_list_into_chunks([1,2,3,4,5,6,7,8], 4).
[[1,2,3,4],[5,6,7,8]]
> uef_lists:split_list_into_chunks([1,2,3,4,5,6,7,8], 8).
[[1,2,3,4,5,6,7,8]]
> uef_lists:split_list_into_chunks([1,2,3,4,5,6,7,8], 9).
[[1,2,3,4,5,6,7,8]]
> uef_lists:split_list_into_chunks([1,2,3,4,5,6,7,8], 99).
[[1,2,3,4,5,6,7,8]]uef_lists:lists_to_list_of_tuples(List1, List2) -> List3.Transforms two lists into one list of two-tuples, where the first element of each tuple is taken from the first list and the second element is taken from the second list one by one.
Examples:
> uef_lists:lists_to_list_of_tuples([a,b,c], [1,2]).
[{a,1},{a,2},{b,1},{b,2},{c,1},{c,2}]
> uef_lists:lists_to_list_of_tuples([a,b,c], [1,2,3]).
[{a,1},{a,2},{a,3},{b,1},{b,2},{b,3},{c,1},{c,2},{c,3}]uef_lists:lists_to_list_of_tuples(List1, List2, List3) -> List4.Transforms three lists into one list of three-tuples, where the first element of each tuple is taken from the first list, the second element is taken from the second list one by one, and the third element is taken from the third list one by one.
Examples:
> uef_lists:lists_to_list_of_tuples([a1,b1], [a2,b2], [a3,b3]).
[{a1,a2,a3},
{a1,a2,b3},
{a1,b2,a3},
{a1,b2,b3},
{b1,a2,a3},
{b1,a2,b3},
{b1,b2,a3},
{b1,b2,b3}]
> uef_lists:lists_to_list_of_tuples([a1,b1], [a2,b2,c2], [a3,b3]).
[{a1,a2,a3},
{a1,a2,b3},
{a1,b2,a3},
{a1,b2,b3},
{a1,c2,a3},
{a1,c2,b3},
{b1,a2,a3},
{b1,a2,b3},
{b1,b2,a3},
{b1,b2,b3},
{b1,c2,a3},
{b1,c2,b3}]uef_maps:delete_nested(Keys, Map1) -> {ok, Map2} | {error, {badkey, SomeKey}} | {error, empty_keys}.Say, Keys is a list of elements Key1, Key2, …, KeyN and Map1 has internal structure #{Key1 ⇒ #{Key2 ⇒ #{… ⇒ #{KeyN ⇒ ValueN}}}}. The function removes key KeyN, if it exists, and its associated value from the corresponding internal map and updates the entire structure of map Map1 getting new map Map2. There are three possible return values:
-
tuple
{ok, Map2}ifKeyNwas removed; -
tuple
{error, {badkey, SomeKey}}ifSomeKeydoes not exist in the structure of mapMap1, whereSomeKeyis one of the elements of listKeys; -
tuple
{error, empty_keys}ifKeysis empty list.
The call fails with a {badmap,Map1} exception if Map1 is not a map, or with a {badlist,Keys} exception if Keys is not a list.
See also: uef_maps:remove_nested/2, uef_maps:take_nested/2.
Examples:
> Map1 = #{1 => #{2 => #{3 => val3, 33 => val33}}}.
#{1 => #{2 => #{3 => val3,33 => val33}}}
> uef_maps:delete_nested([], Map1).
{error,empty_keys}
> uef_maps:delete_nested([1], Map1).
{ok,#{}}
> uef_maps:delete_nested([1,2], Map1).
{ok,#{1 => #{}}}
> uef_maps:delete_nested([1,2,3], Map1).
{ok,#{1 => #{2 => #{33 => val33}}}}
> uef_maps:delete_nested([-1], Map1).
{error,{badkey,-1}}
> uef_maps:delete_nested([1,-2], Map1).
{error,{badkey,-2}}
> uef_maps:delete_nested([1,2,-3], Map1).
{error,{badkey,-3}}
> uef_maps:delete_nested([1,2,3,4], Map1).
{error,{badkey,4}}
> uef_maps:delete_nested([1,2,3,4,5], Map1).
{error,{badkey,4}} % 4, not 5!uef_maps:find_nested(Keys, Map) -> {ok, Value} | error.Traverses nested map Map (map of maps) deep through the keys that are elements of list Keys. Returns tuple {ok, Value}, where Value is the value associated with the last element of list Keys, or error if no value is found.
The call fails with a {badmap,Map} exception if Map is not a map, or with a {badlist,Keys} exception if Keys is not a list.
Examples:
> Value = abc, M3 = #{key4 => Value}, M2 = #{key3 => M3}, M1 = #{key2 => M2}, M0 = #{key1 => M1}.
#{key1 => #{key2 => #{key3 => #{key4 => abc}}}} % M0
> uef_maps:find_nested([key1], M0).
{ok,#{key2 => #{key3 => #{key4 => abc}}}} % {ok, M1}
> uef_maps:find_nested([key1,key2], M0).
{ok,#{key3 => #{key4 => abc}}} % {ok, M2}
> uef_maps:find_nested([key1,key2,key3], M0).
{ok,#{key4 => abc}} % {ok, M3}
> uef_maps:find_nested([key1,key2,key3,key4], M0).
{ok,abc} % {ok, Value}
> uef_maps:find_nested([-1], M0).
error
> uef_maps:find_nested([key1,key2,-3,key4], M0).
error
> uef_maps:find_nested([key1,key2,key3,-4], M0).
error
> uef_maps:find_nested([key1,key2,key3,key4,key5], M0).
** exception error: {badmap,abc}uef_maps:get_nested(Keys, Map) -> Value.Traverses nested map Map (map of maps) deep through the keys that are elements of list Keys. Returns value Value associated with the last element of list Keys.
The call fails with a {badmap,Map} exception if Map is not a map, or with a {badkeys,Keys} exception if no value is found, or with a {badlist,Keys} exception if Keys is not a list.
Examples:
> Value = abc, M3 = #{key4 => Value}, M2 = #{key3 => M3}, M1 = #{key2 => M2}, M0 = #{key1 => M1}.
#{key1 => #{key2 => #{key3 => #{key4 => abc}}}} % M0
> uef_maps:get_nested([key1], M0).
#{key2 => #{key3 => #{key4 => abc}}} % M1
> uef_maps:get_nested([key1,key2], M0).
#{key3 => #{key4 => abc}} % M2
> uef_maps:get_nested([key1,key2,key3], M0).
#{key4 => abc} % M3
> uef_maps:get_nested([key1,key2,key3,key4], M0).
abc % Valueuef_maps:get_nested(Keys, Map, Default) -> Value | Default.Traverses nested map Map (map of maps) deep through the keys that are elements of list Keys. Returns value Value associated with the last element of list Keys. If no value is found, Default is returned.
The call fails with a {badmap,Map} exception if Map is not a map, or with a {badlist,Keys} exception if Keys is not a list. It does not fail if any internal value associated with any element of list Keys is not a map.
Examples:
> Value = abc, Default = default, M3 = #{key4 => Value}, M2 = #{key3 => M3}, M1 = #{key2 => M2}, M0 = #{key1 => M1}.
#{key1 => #{key2 => #{key3 => #{key4 => abc}}}} % M0.
> uef_maps:get_nested([key1,key2,key3,key4], M0, Default).
abc % Value
> uef_maps:get_nested([key1,key2,key3,-4], M0, Default).
default % Default
> uef_maps:get_nested([key1,key2,-3,key4], M0, Default).
default % Default
> uef_maps:get_nested([key1,key2,key3,key4,key5], M0, Default).
default % Default anyway. Doesn't failuef_maps:is_key_nested(Keys, Map) -> true | false.Returns true if map Map contains submaps as values associated with their own key corresponding to the element of list Keys, and returns false otherwise.
The call fails with a {badmap,Map} exception if Map is not a map, or with a {badlist,Keys} exception if Keys is not a list.
Examples:
> M3 = #{key4 => value}, M2 = #{key3 => M3}, M1 = #{key2 => M2}, M0 = #{key1 => M1}.
#{key1 => #{key2 => #{key3 => #{key4 => value}}}} % M0
> uef_maps:is_key_nested([key1,key2,key3,key4], M0).
true
> uef_maps:is_key_nested([key1,key2,key3], M0).
true
> uef_maps:is_key_nested([key1,key2], M0).
true
> uef_maps:is_key_nested([key1], M0).
true
> uef_maps:is_key_nested([], M0).
false
> uef_maps:is_key_nested([key1,key2,key3,key4,key5], M0).
false
> uef_maps:is_key_nested([-1,key2,key3,key4], M0).
false
> uef_maps:is_key_nested([key1,-2,key3,key4], M0).
falseuef_maps:new_nested(Keys) -> Map.Same as uef_maps:new_nested(Keys, #{}). See docs of uef_maps:new_nested/2.
uef_maps:new_nested(Keys, Value) -> Map.Returns new nested map Map with the deepest map #{LastKey ⇒ Value}, where LastKey is the last element of list Keys.
The call fails with a {badlist,Keys} exception if Keys is not a list.
Examples:
> uef_maps:new_nested([], value).
#{}
> uef_maps:new_nested([key], value).
#{key => value}
> uef_maps:new_nested([key1, key2], value).
#{key1 => #{key2 => value}}
> uef_maps:new_nested([key1, key2, key3], value).
#{key1 => #{key2 => #{key3 => value}}}uef_maps:put_nested(Keys, Value, Map1) -> Map2.Say, Keys is a list of elements Key1, Key2, …, KeyN and Map1 has internal structure #{Key1 ⇒ #{Key2 ⇒ #{… ⇒ #{KeyN ⇒ ValueN}}}}. The function associates KeyN with value Value and updates the entire structure of map Map1 returning new map Map2. If some keys from list Keys are not in the structure of map Map1, they will be inserted into the structure of map Map2 in the same order.
The call fails with a {badmap,Map1} exception if Map1 is not a map, or with a {badlist,Keys} exception if Keys is not a list.
See also: uef_maps:update_nested/3.
Examples:
> Map1 = #{1 => #{2 => #{3 => val3}}}.
#{1 => #{2 => #{3 => val3}}} % Map1
> uef_maps:put_nested([], new_value, Map1).
#{1 => #{2 => #{3 => val3}}} % Map1 (empty list of keys)
> uef_maps:put_nested([1], new_value, Map1).
#{1 => new_value}
> uef_maps:put_nested([1,2], new_value, Map1).
#{1 => #{2 => new_value}}
> uef_maps:put_nested([1,2,3], new_value, Map1).
#{1 => #{2 => #{3 => new_value}}}
> uef_maps:put_nested([1,2,-3], new_value, Map1).
#{1 => #{2 => #{-3 => new_value,3 => val3}}}
> uef_maps:put_nested([1,2,3,4], new_value, Map1).
#{1 => #{2 => #{3 => #{4 => new_value}}}}
> uef_maps:put_nested([-1], new_value, Map1).
#{-1 => new_value,1 => #{2 => #{3 => val3}}}
> uef_maps:put_nested([1,-2], new_value, Map1).
#{1 => #{-2 => new_value,2 => #{3 => val3}}}
> uef_maps:put_nested([1,2,-3], new_value, Map1).
#{1 => #{2 => #{-3 => new_value,3 => val3}}}
> uef_maps:put_nested([1,2,3,-4], new_value, Map1).
#{1 => #{2 => #{3 => #{-4 => new_value}}}}uef_maps:remove_nested(Keys, Map1) -> Map2.Say, Keys is a list of elements Key1, Key2, …, KeyN and Map1 has internal structure #{Key1 ⇒ #{Key2 ⇒ #{… ⇒ #{KeyN ⇒ ValueN}}}}. The function removes key KeyN, if it exists, and its associated value from the corresponding internal map and updates the entire structure of map Map1 returning new map Map2. If some keys from list Keys are not in the structure of map Map1 the function returns a map without changes.
The call fails with a {badmap,Map1} exception if Map1 is not a map, or with a {badlist,Keys} exception if Keys is not a list.
See also: uef_maps:delete_nested/2, uef_maps:take_nested/2.
Examples:
> Map1 = #{1 => #{2 => #{3 => val3, 33 => val33}}}.
#{1 => #{2 => #{3 => val3,33 => val33}}}
> uef_maps:remove_nested([], Map1).
#{1 => #{2 => #{3 => val3,33 => val33}}} % Map1 (empty list of keys)
> uef_maps:remove_nested([1], Map1).
#{}
> uef_maps:remove_nested([1,2], Map1).
#{1 => #{}}
> uef_maps:remove_nested([1,2,3], Map1).
#{1 => #{2 => #{33 => val33}}}
> uef_maps:remove_nested([-1], Map1).
#{1 => #{2 => #{3 => val3,33 => val33}}} % Map1
> uef_maps:remove_nested([1,-2], Map1).
#{1 => #{2 => #{3 => val3,33 => val33}}} % Map1
> uef_maps:remove_nested([1,2,-3], Map1).
#{1 => #{2 => #{3 => val3,33 => val33}}} % Map1
> uef_maps:remove_nested([1,2,3,4], Map1).
#{1 => #{2 => #{3 => val3,33 => val33}}} % Map1
> uef_maps:remove_nested([1,2,3,4,5], Map1).
#{1 => #{2 => #{3 => val3,33 => val33}}} % Map1uef_maps:take_nested(Keys, Map1) -> {Value, Map2} | error.Say, Keys is a list of elements Key1, Key2, …, KeyN and Map1 has internal structure #{Key1 ⇒ #{Key2 ⇒ #{… ⇒ #{KeyN ⇒ Value}}}}. The function removes key KeyN, if it exists, and its associated value Value from the corresponding internal map and updates the entire structure of map Map1 returning tuple {Value, Map2}. If some keys from list Keys are not in the structure of map Map1 the function returns error.
The call fails with a {badmap,Map1} exception if Map1 is not a map, or with a {badlist,Keys} exception if Keys is not a list.
See also: uef_maps:delete_nested/2, uef_maps:remove_nested/2.
Examples:
> Map1 = #{1 => #{2 => #{3 => val3, 33 => val33}}}.
#{1 => #{2 => #{3 => val3,33 => val33}}}
> uef_maps:take_nested([], Map1).
error
> uef_maps:take_nested([1], Map1).
{#{2 => #{3 => val3,33 => val33}},#{}}
> uef_maps:take_nested([1,2], Map1).
{#{3 => val3,33 => val33},#{1 => #{}}}
> uef_maps:take_nested([1,2,3], Map1).
{val3,#{1 => #{2 => #{33 => val33}}}}
> uef_maps:take_nested([-1], Map1).
error
> uef_maps:take_nested([1,-2], Map1).
error
> uef_maps:take_nested([1,2,-3], Map1).
error
> uef_maps:take_nested([1,2,3,4], Map1).
error
> uef_maps:take_nested([1,2,3,4,5], Map1).
erroruef_maps:update_nested(Keys, Value, Map1) -> Map2.Works similar to uef_maps:put_nested/3 with the difference that it fails with a {badkey,SomeKey} exception if SomeKey does not exist in the structure of map Map1, where SomeKey is one of the elements of list Keys.
The call also fails with a {badmap,Map1} exception if Map1 is not a map, or with a {badlist,Keys} exception if Keys is not a list.
Examples:
> Map1 = #{1 => #{2 => #{3 => val3}}}.
#{1 => #{2 => #{3 => val3}}} % Map1
> uef_maps:update_nested([], new_value, Map1).
#{1 => #{2 => #{3 => val3}}} % Map1 (empty list of keys)
> uef_maps:update_nested([1], new_value, Map1).
#{1 => new_value}
> uef_maps:update_nested([1,2], new_value, Map1).
#{1 => #{2 => new_value}}
> uef_maps:update_nested([1,2,3], new_value, Map1).
#{1 => #{2 => #{3 => new_value}}}
> uef_maps:update_nested([1,2,3,4], new_value, Map1).
** exception error: {badkey,4}
> uef_maps:update_nested([1,2,3,4,5], new_value, Map1).
** exception error: {badkey,4} % 4, not 5! because 4 is before
> uef_maps:update_nested([-1], new_value, Map1).
** exception error: {badkey,-1}
> uef_maps:update_nested([1,-2], new_value, Map1).
** exception error: {badkey,-2}
> uef_maps:update_nested([1,2,-3], new_value, Map1).
** exception error: {badkey,-3}
> uef_maps:update_nested([1,2,3,-4], new_value, Map1).
** exception error: {badkey,-4}uef_num:ctz(Integer) -> TrailingZeros.Counts trailing zeros in the binary representation of a positive integer. Returns the number of zero bits following the least significant one bit.
The call fails with a {badarg,Integer} exception if Integer is not a positive integer.
Examples:
> uef_num:ctz(2#10001000).
3
> uef_num:ctz(7).
0
> uef_num:ctz(2#00101010).
1
> uef_num:ctz(2#1000000000000000000000000000000000000000000000000000000000000000).
63
> uef_num:ctz(2#1111111111111111111111111111111111111111111111111111111111111111).
0
> uef_num:ctz(16#FFFFFFFFFFFFFFFF).
0uef_num:lsb_pos(Integer) -> Position.Returns the position of the least significant bit (LSB) in the binary representation of a positive integer.
The call fails with a {badarg,Integer} exception if Integer is not a positive integer.
Examples:
> uef_num:lsb_pos(2#10001000).
4
> uef_num:lsb_pos(7).
1
> uef_num:lsb_pos(2#00101010).
2
> uef_num:lsb_pos(2#1000000000000000000000000000000000000000000000000000000000000000).
64
> uef_num:lsb_pos(2#1111111111111111111111111111111111111111111111111111111111111111).
1
> uef_num:lsb_pos(16#FFFFFFFFFFFFFFFF).
1uef_num:msb_pos(Integer) -> Position.Returns the position of the most significant bit (MSB) in the binary representation of a positive integer.
The call fails with a {badarg,Integer} exception if Integer is not a positive integer.
Examples:
> uef_num:msb_pos(2#111).
3
> uef_num:msb_pos(7).
3
> uef_num:msb_pos(2#0010101).
5
> uef_num:msb_pos(2#1000000000000000000000000000000000000000000000000000000000000000).
64
> uef_num:msb_pos(2#1111111111111111111111111111111111111111111111111111111111111111).
64
> uef_num:msb_pos(16#FFFFFFFFFFFFFFFF).
64uef_num:popcount(Integer) -> OneBits.Returns the number of 1’s (ones or one-bits) in the binary representation of a non-negative integer. Also known as population count, pop count, popcount, sideways sum, bit summation, or Hamming weight.
The call fails with a {badarg,Integer} exception if Integer is not a non-negative integer.
Examples:
> uef_num:popcount(7).
3
> uef_num:popcount(0).
0
> uef_num:popcount(2#1010101).
4
> uef_num:popcount(2#1000000000000000000000000000000000000000000000000000000000000000).
1
> uef_num:popcount(2#1111111111111111111111111111111111111111111111111111111111111111).
64
> uef_num:popcount(16#FFFFFFFFFFFFFFFF).
64uef_num:round_number(Number, Precision) -> Float.Rounds the number to the specified precision.
Examples:
> uef_num:round_number(10, 2).
10.0
> uef_num:round_number(123.786, 2).
123.79uef_time:add_seconds(Seconds) -> NewDateTime.Same as uef_time:add_seconds(erlang:localtime(), Seconds). See docs of uef_time:add_seconds/2.
Types:
Seconds :: integer().
NewDateTime :: calendar:datetime().uef_time:add_seconds(DateOrDatetime, Seconds) -> NewDateTime.Adds the number of seconds Seconds to DateOrDatetime and returns a new datetime value.
Types:
DateOrDatetime :: calendar:date() | calendar:datetime().
Seconds :: integer().
NewDateTime :: calendar:datetime().Examples:
> uef_time:add_seconds({2019, 1, 1}, 10).
{{2019,1,1},{0,0,10}}
> uef_time:add_seconds({2019, 1, 1}, -10).
{{2018,12,31},{23,59,50}}
> uef_time:add_seconds({{2019, 1, 1}, {23, 59, 0}}, 10).
{{2019,1,1},{23,59,10}}
> uef_time:add_seconds({{2019, 1, 1}, {23, 59, 0}}, -10).
{{2019,1,1},{23,58,50}}uef_time:add_minutes(Minutes) -> NewDateTime.Same as uef_time:add_seconds(Minutes * 60). See docs of uef_time:add_seconds/1.
Types:
Minutes :: integer().
NewDateTime :: calendar:datetime().uef_time:add_minutes(DateOrDatetime, Minutes) -> NewDateTime.Adds the number of minutes Minutes to DateOrDatetime and returns a new datetime value.
Types:
DateOrDatetime :: calendar:date() | calendar:datetime().
Minutes :: integer().
NewDateTime :: calendar:datetime().Examples:
> uef_time:add_minutes({2019, 1, 1}, 10).
{{2019,1,1},{0,10,0}}
> uef_time:add_minutes({2019, 1, 1}, -10).
{{2018,12,31},{23,50,0}}
> uef_time:add_minutes({{2019, 1, 1}, {23, 59, 0}}, 10).
{{2019,1,2},{0,9,0}}
> uef_time:add_minutes({{2019, 1, 1}, {0, 1, 0}}, -10).
{{2018,12,31},{23,51,0}}uef_time:add_hours(Hours) -> NewDateTime.Same as uef_time:add_seconds(Hours * 3600). See docs of uef_time:add_seconds/1.
Types:
Hours :: integer().
NewDateTime :: calendar:datetime().uef_time:add_hours(DateOrDatetime, Hours) -> NewDateTime.Adds the number of hours Hours to DateOrDatetime and returns a new datetime value.
Types:
DateOrDatetime :: calendar:date() | calendar:datetime().
Hours :: integer().
NewDateTime :: calendar:datetime().Examples:
> uef_time:add_hours({2019, 1, 1}, 10).
{{2019,1,1},{10,0,0}}
> uef_time:add_hours({2019, 1, 1}, -10).
{{2018,12,31},{14,0,0}}
> uef_time:add_hours({{2019, 1, 1}, {23, 59, 0}}, 10).
{{2019,1,2},{9,59,0}}
> uef_time:add_hours({{2019, 1, 1}, {0, 1, 0}}, -10).
{{2018,12,31},{14,1,0}}uef_time:add_days(Days) -> NewDateTime.Same as uef_time:add_seconds(Days * 86400). See docs of uef_time:add_seconds/1.
Types:
Days :: integer().
NewDateTime :: calendar:datetime().uef_time:add_days(DateOrDatetime, Days) -> NewDateOrDateTime.Adds the number of days Days to DateOrDatetime and returns a new date or datetime value. The type of NewDateOrDateTime is the same as the type of DateOrDatetime.
Types:
DateOrDatetime :: calendar:date() | calendar:datetime().
Days :: integer().
NewDateOrDateTime :: calendar:date() | calendar:datetime().Examples:
> uef_time:add_days({2019, 1, 1}, 10).
{2019,1,11}
> uef_time:add_days({2019, 1, 1}, -10).
{2018,12,22}
> uef_time:add_days({{2019, 1, 1}, {23, 59, 0}}, 10).
{{2019,1,11},{23,59,0}}
> uef_time:add_days({{2019, 1, 1}, {0, 1, 0}}, -10).
{{2018,12,22},{0,1,0}}uef_time:add_weeks(Weeks) -> NewDateTime.Same as uef_time:add_seconds(Weeks * 604800). See docs of uef_time:add_seconds/1.
Types:
Weeks :: integer().
NewDateTime :: calendar:datetime().uef_time:add_weeks(DateOrDatetime, Weeks) -> NewDateOrDateTime.Adds the number of weeks Weeks to DateOrDatetime and returns a new date or datetime value. The type of NewDateOrDateTime is the same as the type of DateOrDatetime.
Types:
DateOrDatetime :: calendar:date() | calendar:datetime().
Weeks :: integer().
NewDateOrDateTime :: calendar:date() | calendar:datetime().Examples:
> uef_time:add_weeks({2019, 1, 1}, 4).
{2019,1,29}
> uef_time:add_weeks({2019, 1, 1}, -4).
{2018,12,4}
> uef_time:add_weeks({{2019, 1, 1}, {23, 59, 0}}, 4).
{{2019,1,29},{23,59,0}}
> uef_time:add_weeks({{2019, 1, 1}, {0, 1, 0}}, -4).
{{2018,12,4},{0,1,0}}uef_time:add_months(Months) -> NewDateTime.Same as uef_time:add_months(erlang:localtime(), Months). See docs of uef_time:add_months/2.
Types:
Months :: integer().
NewDateTime :: calendar:datetime().uef_time:add_months(DateOrDatetime, Months) -> NewDateOrDateTime.Adds the number of months Months to DateOrDatetime and returns a new date or datetime value. The type of NewDateOrDateTime is the same as the type of DateOrDatetime.
Types:
DateOrDatetime :: calendar:date() | calendar:datetime().
Months :: integer().
NewDateOrDateTime :: calendar:date() | calendar:datetime().Examples:
> uef_time:add_months({2019, 1, 31}, 1).
{2019,2,28}
> uef_time:add_months({2016, 1, 31}, 1).
{2016,2,29}
> uef_time:add_months({2019, 1, 31}, -1).
{2018,12,31}
> uef_time:add_months({{2019, 1, 1}, {23, 59, 0}}, 1).
{{2019,2,1},{23,59,0}}
> uef_time:add_months({{2019, 1, 1}, {0, 1, 0}}, -1).
{{2018,12,1},{0,1,0}}uef_time:add_years(Years) -> NewDateTime.Same as uef_time:add_years(erlang:localtime(), Years). See docs of uef_time:add_years/2.
Types:
Years :: integer().
NewDateTime :: calendar:datetime().uef_time:add_years(DateOrDatetime, Years) -> NewDateOrDateTime.Adds the number of years Years to DateOrDatetime and returns a new date or datetime value. The type of NewDateOrDateTime is the same as the type of DateOrDatetime.
Types:
DateOrDatetime :: calendar:date() | calendar:datetime().
Years :: integer().
NewDateOrDateTime :: calendar:date() | calendar:datetime().Examples:
> uef_time:add_years({2019, 1, 31}, 1).
{2020,1,31}
> uef_time:add_years({2019, 1, 31}, -1).
{2018,1,31}
> uef_time:add_years({{2019, 1, 1}, {23, 59, 0}}, 1).
{{2020,1,1},{23,59,0}}
> uef_time:add_years({{2019, 1, 1}, {0, 1, 0}}, -1).
{{2018,1,1},{0,1,0}}uef_time:add_time(Periods) -> NewDateTime.Same as uef_time:add_time(erlang:localtime(), Periods). See docs of uef_time:add_time/2. NewDateTime is of type calendar:datetime(). See types for Periods in Types section of function uef_time:add_time/2.
uef_time:add_time(DateOrDatetime, Periods) -> NewDateOrDateTime.Adds one or more periods of time to DateOrDatetime and returns a new date or datetime value. This is a universal function based on functions uef_time:add_seconds/2, uef_time:add_minutes/2, uef_time:add_hours/2, uef_time:add_days/2, uef_time:add_weeks/2, uef_time:add_months/2 and uef_time:add_years/2. The type of NewDateOrDateTime depends on the type of DateOrDatetime and Periods (see Examples).
Types:
DateOrDatetime :: calendar:date() | calendar:datetime().
NewDateOrDateTime :: calendar:date() | calendar:datetime().
psecond() :: sec | second | seconds.
pminute() :: min | minute | minutes.
phour() :: hrs | hour | hours.
pday() :: day | days.
pmonth() :: month | months.
pyear() :: year | years.
ptype() :: psecond() | pminute() | phour() | pday() | pmonth() | pyear().
period() :: {integer(), ptype()} | {ptype(), integer()}.
periods() :: [period()].Examples:
> uef_time:add_time({2000, 1, 1}, [{1, year}, {1, month}, {1, week}, {1, day}, {1, hour}, {1, minute}, {1, second}]).
{{2001,2,9},{1,1,1}} % type calendar:datetime()
> uef_time:add_time({2000, 1, 1}, [{1, year}, {1, month}, {1, week}, {1, day}]).
{2001,2,9} % type calendar:date()
> uef_time:add_time({{2000, 1, 1}, {0, 0, 0}}, [{1, year}, {1, month}, {1, week}, {1, day}]).
{{2001,2,9},{0,0,0}} % type calendar:datetime()
> uef_time:add_time({2000, 1, 1}, [{year, 1}, {month, 1}, {week, 1}, {day, 1}, {hour, 1}, {minute, 1}, {second, 1}]).
{{2001,2,9},{1,1,1}}
> uef_time:add_time({2000, 1, 1}, [{1, hrs}, {1, min}, {1, sec}]).
{{2000,1,1},{1,1,1}}
> uef_time:add_time({{2000, 1, 31}, {23, 59, 59}}, [{1, hour}, {1, minute}, {1, second}]).
{{2000,2,1},{1,1,0}}
> uef_time:add_time({{2000, 1, 31}, {23, 59, 59}}, [{1, second}]).
{{2000,2,1},{0,0,0}}
> uef_time:add_time({2000, 1, 1}, [{1, years}]) =:= uef_time:add_years({2000, 1, 1}, 1).
true
> uef_time:add_time({2000, 1, 1}, [{1, month}]) =:= uef_time:add_months({2000, 1, 1}, 1).
trueuef_time:today() -> CurrentDate.Returns the current date as {Year, Month, Day}. Same as erlang:date(). CurrentDate is of type calendar:date().
uef_time:tomorrow() -> TomorrowDate.Returns tomorrow’s date as {Year, Month, Day}. TomorrowDate is of type calendar:date().
uef_time:yesterday() -> YesterdayDate.Returns yesterday’s date as {Year, Month, Day}. YesterdayDate is of type calendar:date().
uef_time:unix_time() -> Seconds.Returns the current number of seconds since 00:00:00 (UTC), 1 January 1970. It also known as Unix time or POSIX time or UNIX Epoch time.
Example:
> uef_time:unix_time().
1557670215uef_time:unix_time(Datetime) -> Seconds.Returns the number of seconds elapsed between 00:00:00 (UTC), 1 January 1970 and Datetime. Datetime must be of type calenadr:datetime().
Examples:
> uef_time:unix_time({{1970,1,1}, {0,0,0}}).
0
> uef_time:unix_time({{2000,1,1}, {23,59,59}}).
946771199uef_time:days_diff(Date) -> Days.Returns the difference in days between Date and the current local date provided by function erlang:date(). Date must be of type calendar:date() ({Year, Month, Day}). Days is a positive value if Date is after erlang:date() or a negative value otherwise.
uef_time:days_diff(Date1, Date2) -> Days.Returns the difference in days between Date2 and Date1. Date1 and Date2 must be of type calendar:date() ({Year, Month, Day}). Days is a positive value if Date2 is after Date1 or a negative value otherwise.
Examples:
> uef_time:days_diff({1999, 1, 31}, {2019, 12, 31}).
7639
> uef_time:days_diff({2019, 12, 31}, {1999, 1, 31}).
-7639uef_time:seconds_diff(DateTime) -> Seconds.Returns the difference in seconds between Date and the current local time provided by function erlang:localtime(). DateTime must be of type calendar:datetime() ({{Year, Month, Day}, {Hour, Minute, Second}}). Seconds is a positive value if DateTime is after erlang:localtime() or a negative value otherwise.
uef_time:seconds_diff(DateTime1, DateTime2) -> Seconds.Returns the difference in seconds between DateTime2 and DateTime1. DateTime1 and DateTime2 must be of type calendar:datetime() ({{Year, Month, Day}, {Hour, Minute, Second}}). Seconds is a positive value if DateTime2 is after DateTime1 or a negative value otherwise.
Examples:
> uef_time:seconds_diff({{1999, 1, 31}, {0, 0, 0}}, {{2019, 12, 31}, {0, 0, 0}}).
660009600
> uef_time:seconds_diff({{2019, 12, 31}, {0, 0, 0}}, {{1999, 1, 31}, {0, 0, 0}}).
-660009600