Packages
krug
1.1.43
2.0.36
2.0.35
2.0.34
2.0.33
2.0.32
2.0.31
2.0.30
2.0.29
2.0.27
2.0.26
2.0.25
2.0.24
2.0.23
2.0.22
2.0.20
2.0.19
2.0.18
2.0.17
2.0.16
2.0.15
2.0.14
2.0.13
2.0.12
2.0.11
2.0.10
2.0.9
2.0.8
2.0.7
2.0.6
2.0.5
2.0.4
2.0.1
2.0.0
1.1.53
1.1.52
1.1.50
1.1.49
1.1.48
1.1.47
1.1.46
1.1.45
1.1.44
1.1.43
1.1.42
1.1.41
1.1.40
1.1.39
1.1.38
1.1.37
1.1.36
1.1.35
1.1.34
1.1.33
1.1.32
1.1.31
1.1.30
1.1.29
1.1.28
1.1.27
1.1.26
1.1.25
1.1.24
1.1.23
1.1.22
1.1.21
1.1.20
1.1.19
1.1.18
1.1.17
1.1.16
1.1.15
1.1.14
1.1.12
1.1.10
1.1.9
1.1.8
1.1.7
1.1.6
1.1.5
1.1.4
1.1.3
1.1.2
1.1.1
1.1.0
1.0.9
1.0.8
1.0.7
1.0.6
1.0.5
1.0.4
1.0.3
1.0.2
1.0.1
1.0.0
0.5.5
0.5.4
0.5.3
0.5.2
0.5.1
0.5.0
0.4.31
0.4.30
0.4.29
0.4.28
0.4.27
0.4.26
0.4.25
0.4.24
0.4.23
0.4.22
0.4.20
0.4.19
0.4.18
0.4.17
0.4.16
0.4.15
0.4.14
0.4.13
0.4.12
0.4.11
0.4.10
0.4.9
0.4.8
0.4.7
0.4.6
0.4.5
0.4.4
0.4.3
0.4.2
0.4.1
0.4.0
0.3.9
0.3.8
0.3.7
0.3.6
0.3.5
0.3.4
0.3.3
0.3.2
0.3.1
0.3.0
0.2.1
0.2.0
0.1.0
A Utilitary package functionalities modules for improve a secure performatic development.
Current section
Files
Jump to
Current section
Files
lib/krug/util/array.util.ex
defmodule Krug.ArrayUtil do
@moduledoc """
Utilitary module to handle array transformations.
"""
@doc """
Rotates an ```array``` X ```positions``` in direction from left to right.
A initial array [1,2,3,4] turn in [2,3,4,1] if rotate ```positions``` equal
to 1.
The parameter ```unsafe``` can be set to true when you have total sure that all parameters are
not null/empty. This will improve some performance.
## Examples
```elixir
iex > Krug.ArrayUtil.rotate_right(nil,1)
nil
```
```elixir
iex > Krug.ArrayUtil.rotate_right([],1)
[]
```
```elixir
iex > Krug.ArrayUtil.rotate_right([1],2)
[1]
```
```elixir
iex > Krug.ArrayUtil.rotate_right([1,2,3,4],nil)
[1,2,3,4]
```
```elixir
iex > Krug.ArrayUtil.rotate_right([1,2,3,4],1)
[2,3,4,1]
```
```elixir
iex > Krug.ArrayUtil.rotate_right([1,2,3,4],3)
[4,1,2,3]
```
"""
@doc since: "0.4.3"
def rotate_right(array,positions,unsafe \\ false) do
cond do
(unsafe)
-> array
|> rotate_right2(positions)
(nil == array
or Enum.empty?(array))
-> array
(nil == positions
or !(positions > 0))
-> array
true
-> array
|> rotate_right2(positions)
end
end
@doc """
Rotates an ```array``` X ```positions``` in direction from right to left.
A initial array [1,2,3,4] turn in [4,1,2,3] if rotate ```positions``` equal
to 1.
The parameter ```unsafe``` can be set to true when you have total sure that all parameters are
not null/empty. This will improve some performance.
## Examples
```elixir
iex > Krug.ArrayUtil.rotate_left(nil,1)
nil
```
```elixir
iex > Krug.ArrayUtil.rotate_left([],1)
[]
```
```elixir
iex > Krug.ArrayUtil.rotate_left([1],2)
[1]
```
```elixir
iex > Krug.ArrayUtil.rotate_left([1,2,3,4],1)
[4,1,2,3]
```
```elixir
iex > Krug.ArrayUtil.rotate_left([1,2,3,4],3)
[2,3,4,1]
```
"""
@doc since: "0.4.3"
def rotate_left(array,positions,unsafe \\ false) do
cond do
(unsafe)
-> array
|> rotate_left2(positions)
(nil == array
or Enum.empty?(array))
-> array
(nil == positions
or !(positions > 0))
-> array
true
-> array
|> rotate_left2(positions)
end
end
defp rotate_right2(array,positions) do
size = length(array)
remainder = rem(positions,size)
cond do
(remainder == 0
or size < 2)
-> array
true
-> array
|> rotate_right_positions(remainder,0)
end
end
defp rotate_left2(array,positions) do
size = length(array)
remainder = rem(positions,size)
cond do
(remainder == 0
or size < 2)
-> array
true
-> array
|> rotate_left_positions(remainder,0)
end
end
defp rotate_right_positions(array,positions,count) do
cond do
(count >= positions)
-> array
true
-> array
|> rotate_right_one_position()
|> rotate_right_positions(positions,count + 1)
end
end
defp rotate_right_one_position(array) do
[
(array |> hd())
| (array |> tl() |> Enum.reverse())
]
|> Enum.reverse()
end
defp rotate_left_positions(array,positions,count) do
cond do
(count >= positions)
-> array
true
-> array
|> rotate_left_one_position()
|> rotate_left_positions(positions,count + 1)
end
end
defp rotate_left_one_position(array) do
array = array |> Enum.reverse()
[
(array |> hd())
| (array |> tl() |> Enum.reverse())
]
end
end