Skip to content

Commit f299a9a

Browse files
committed
Add Elixir Integer module
Signed-off-by: Daniel Kukula <[email protected]>
1 parent bf262be commit f299a9a

File tree

3 files changed

+77
-0
lines changed

3 files changed

+77
-0
lines changed

libs/exavmlib/lib/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ set(ELIXIR_MODULES
2929
Console
3030
GPIO
3131
I2C
32+
Integer
3233
LEDC
3334
Access
3435
Enum

libs/exavmlib/lib/Integer.ex

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
# This file based on elixir-lang Integer module.
2+
#
3+
# Copyright 2012-2022 Elixir Contributors
4+
# https://github.com/elixir-lang/elixir/commits/v1.14.3/lib/elixir/lib/integer.ex
5+
#
6+
# Licensed under the Apache License, Version 2.0 (the "License");
7+
# you may not use this file except in compliance with the License.
8+
# You may obtain a copy of the License at
9+
#
10+
# http://www.apache.org/licenses/LICENSE-2.0
11+
#
12+
# Unless required by applicable law or agreed to in writing, software
13+
# distributed under the License is distributed on an "AS IS" BASIS,
14+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15+
# See the License for the specific language governing permissions and
16+
# limitations under the License.
17+
#
18+
# SPDX-License-Identifier: Apache-2.0
19+
#
20+
21+
defmodule Integer do
22+
@compile {:autoload, false}
23+
@moduledoc """
24+
This module provides functions for working with integers.
25+
This is not a full implementation of the Elixir Integer module.
26+
"""
27+
28+
def floor_div(dividend, divisor) do
29+
if dividend * divisor < 0 and rem(dividend, divisor) != 0 do
30+
div(dividend, divisor) - 1
31+
else
32+
div(dividend, divisor)
33+
end
34+
end
35+
36+
def gcd(integer1, integer2) when is_integer(integer1) and is_integer(integer2) do
37+
gcd_positive(abs(integer1), abs(integer2))
38+
end
39+
40+
defp gcd_positive(0, integer2), do: integer2
41+
defp gcd_positive(integer1, 0), do: integer1
42+
defp gcd_positive(integer1, integer2), do: gcd_positive(integer2, rem(integer1, integer2))
43+
44+
def mod(dividend, divisor) do
45+
remainder = rem(dividend, divisor)
46+
47+
if remainder * divisor < 0 do
48+
remainder + divisor
49+
else
50+
remainder
51+
end
52+
end
53+
54+
def to_charlist(integer, base \\ 10) do
55+
:erlang.integer_to_list(integer, base)
56+
end
57+
58+
def to_string(integer, base \\ 10) do
59+
:erlang.integer_to_binary(integer, base)
60+
end
61+
end

libs/exavmlib/lib/Kernel.ex

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,21 @@ defmodule Kernel do
2222
# This avoids crashing the compiler at build time
2323
@compile {:autoload, false}
2424

25+
@doc """
26+
Returns an integer which is the arithmetical absolute value of `number`.
27+
28+
## Examples
29+
iex> abs(3)
30+
3
31+
iex> abs(-3)
32+
3
33+
"""
34+
def abs(number), do: :erlang.abs(number)
35+
36+
def div(dividend, divisor), do: :erlang.div(dividend, divisor)
37+
38+
def rem(dividend, divisor), do: :erlang.rem(dividend, divisor)
39+
2540
def inspect(term, opts \\ []) when is_list(opts) do
2641
case term do
2742
t when is_atom(t) ->

0 commit comments

Comments
 (0)