Skip to content

Commit

Permalink
Initial commit
Browse files Browse the repository at this point in the history
  • Loading branch information
Igor Kapkov committed Mar 1, 2015
0 parents commit 7606cf0
Show file tree
Hide file tree
Showing 6 changed files with 348 additions and 0 deletions.
4 changes: 4 additions & 0 deletions .gitignore
@@ -0,0 +1,4 @@
/_build
/deps
erl_crash.dump
*.ez
31 changes: 31 additions & 0 deletions README.md
@@ -0,0 +1,31 @@
# Base62

Base62 encoder/decoder in pure Elixir.

## Usage

### Encode

```
iex> Base62.encode(28)
"S"
iex> Base62.encode(44)
"i"
iex> Base62.encode(280)
"4W"
```

### Decode

```
iex> Base62.decode("100")
3844
iex> Base62.decode("igas")
10650166
iex> Base62.decode("EvilMartians")
776957886790921093120
```
144 changes: 144 additions & 0 deletions lib/base62.ex
@@ -0,0 +1,144 @@
defmodule Base62 do
def encode(0), do: "0"
def encode(1), do: "1"
def encode(2), do: "2"
def encode(3), do: "3"
def encode(4), do: "4"
def encode(5), do: "5"
def encode(6), do: "6"
def encode(7), do: "7"
def encode(8), do: "8"
def encode(9), do: "9"
def encode(10), do: "A"
def encode(11), do: "B"
def encode(12), do: "C"
def encode(13), do: "D"
def encode(14), do: "E"
def encode(15), do: "F"
def encode(16), do: "G"
def encode(17), do: "H"
def encode(18), do: "I"
def encode(19), do: "J"
def encode(20), do: "K"
def encode(21), do: "L"
def encode(22), do: "M"
def encode(23), do: "N"
def encode(24), do: "O"
def encode(25), do: "P"
def encode(26), do: "Q"
def encode(27), do: "R"
def encode(28), do: "S"
def encode(29), do: "T"
def encode(30), do: "U"
def encode(31), do: "V"
def encode(32), do: "W"
def encode(33), do: "X"
def encode(34), do: "Y"
def encode(35), do: "Z"
def encode(36), do: "a"
def encode(37), do: "b"
def encode(38), do: "c"
def encode(39), do: "d"
def encode(40), do: "e"
def encode(41), do: "f"
def encode(42), do: "g"
def encode(43), do: "h"
def encode(44), do: "i"
def encode(45), do: "j"
def encode(46), do: "k"
def encode(47), do: "l"
def encode(48), do: "m"
def encode(49), do: "n"
def encode(50), do: "o"
def encode(51), do: "p"
def encode(52), do: "q"
def encode(53), do: "r"
def encode(54), do: "s"
def encode(55), do: "t"
def encode(56), do: "u"
def encode(57), do: "v"
def encode(58), do: "w"
def encode(59), do: "x"
def encode(60), do: "y"
def encode(61), do: "z"
def encode(number) do
encode(div(number, 62)) <> encode(rem(number, 62))
end

def decode("0"), do: 0
def decode("1"), do: 1
def decode("2"), do: 2
def decode("3"), do: 3
def decode("4"), do: 4
def decode("5"), do: 5
def decode("6"), do: 6
def decode("7"), do: 7
def decode("8"), do: 8
def decode("9"), do: 9
def decode("A"), do: 10
def decode("B"), do: 11
def decode("C"), do: 12
def decode("D"), do: 13
def decode("E"), do: 14
def decode("F"), do: 15
def decode("G"), do: 16
def decode("H"), do: 17
def decode("I"), do: 18
def decode("J"), do: 19
def decode("K"), do: 20
def decode("L"), do: 21
def decode("M"), do: 22
def decode("N"), do: 23
def decode("O"), do: 24
def decode("P"), do: 25
def decode("Q"), do: 26
def decode("R"), do: 27
def decode("S"), do: 28
def decode("T"), do: 29
def decode("U"), do: 30
def decode("V"), do: 31
def decode("W"), do: 32
def decode("X"), do: 33
def decode("Y"), do: 34
def decode("Z"), do: 35
def decode("a"), do: 36
def decode("b"), do: 37
def decode("c"), do: 38
def decode("d"), do: 39
def decode("e"), do: 40
def decode("f"), do: 41
def decode("g"), do: 42
def decode("h"), do: 43
def decode("i"), do: 44
def decode("j"), do: 45
def decode("k"), do: 46
def decode("l"), do: 47
def decode("m"), do: 48
def decode("n"), do: 49
def decode("o"), do: 50
def decode("p"), do: 51
def decode("q"), do: 52
def decode("r"), do: 53
def decode("s"), do: 54
def decode("t"), do: 55
def decode("u"), do: 56
def decode("v"), do: 57
def decode("w"), do: 58
def decode("x"), do: 59
def decode("y"), do: 60
def decode("z"), do: 61
def decode(binary) do
binary
|> String.split("", trim: true)
|> Enum.reverse
|> decode(0)
|> round
end

defp decode([last], step) do
decode(last) * :math.pow(62, step)
end
defp decode([head|tail], step) do
decode(head) * :math.pow(62, step) + decode(tail, step + 1)
end
end
26 changes: 26 additions & 0 deletions mix.exs
@@ -0,0 +1,26 @@
defmodule Base62.Mixfile do
use Mix.Project

def project do
[app: :base62,
version: "1.0.0",
elixir: "~> 1.0",
description: description,
package: package,
deps: deps]
end

def application, do: []

defp deps, do: []

defp description do
"Base62 encoder/decoder in pure Elixir."
end

defp package do
[contributors: ["Igor Kapkov"],
files: ["lib", "mix.exs", "README.md"],
links: %{"Github" => "https://github.com/igas/base62"}]
end
end
142 changes: 142 additions & 0 deletions test/base62_test.exs
@@ -0,0 +1,142 @@
defmodule Base62Test do
use ExUnit.Case, async: true

import Base62

test :encode do
assert encode(0) == "0"
assert encode(1) == "1"
assert encode(2) == "2"
assert encode(3) == "3"
assert encode(4) == "4"
assert encode(5) == "5"
assert encode(6) == "6"
assert encode(7) == "7"
assert encode(8) == "8"
assert encode(9) == "9"
assert encode(10) == "A"
assert encode(11) == "B"
assert encode(12) == "C"
assert encode(13) == "D"
assert encode(14) == "E"
assert encode(15) == "F"
assert encode(16) == "G"
assert encode(17) == "H"
assert encode(18) == "I"
assert encode(19) == "J"
assert encode(20) == "K"
assert encode(21) == "L"
assert encode(22) == "M"
assert encode(23) == "N"
assert encode(24) == "O"
assert encode(25) == "P"
assert encode(26) == "Q"
assert encode(27) == "R"
assert encode(28) == "S"
assert encode(29) == "T"
assert encode(30) == "U"
assert encode(31) == "V"
assert encode(32) == "W"
assert encode(33) == "X"
assert encode(34) == "Y"
assert encode(35) == "Z"
assert encode(36) == "a"
assert encode(37) == "b"
assert encode(38) == "c"
assert encode(39) == "d"
assert encode(40) == "e"
assert encode(41) == "f"
assert encode(42) == "g"
assert encode(43) == "h"
assert encode(44) == "i"
assert encode(45) == "j"
assert encode(46) == "k"
assert encode(47) == "l"
assert encode(48) == "m"
assert encode(49) == "n"
assert encode(50) == "o"
assert encode(51) == "p"
assert encode(52) == "q"
assert encode(53) == "r"
assert encode(54) == "s"
assert encode(55) == "t"
assert encode(56) == "u"
assert encode(57) == "v"
assert encode(58) == "w"
assert encode(59) == "x"
assert encode(60) == "y"
assert encode(61) == "z"
assert encode(62) == "10"
assert encode(100) == "1c"
assert encode(124) == "20"
end

test :decode do
assert decode("0") == 0
assert decode("1") == 1
assert decode("2") == 2
assert decode("3") == 3
assert decode("4") == 4
assert decode("5") == 5
assert decode("6") == 6
assert decode("7") == 7
assert decode("8") == 8
assert decode("9") == 9
assert decode("A") == 10
assert decode("B") == 11
assert decode("C") == 12
assert decode("D") == 13
assert decode("E") == 14
assert decode("F") == 15
assert decode("G") == 16
assert decode("H") == 17
assert decode("I") == 18
assert decode("J") == 19
assert decode("K") == 20
assert decode("L") == 21
assert decode("M") == 22
assert decode("N") == 23
assert decode("O") == 24
assert decode("P") == 25
assert decode("Q") == 26
assert decode("R") == 27
assert decode("S") == 28
assert decode("T") == 29
assert decode("U") == 30
assert decode("V") == 31
assert decode("W") == 32
assert decode("X") == 33
assert decode("Y") == 34
assert decode("Z") == 35
assert decode("a") == 36
assert decode("b") == 37
assert decode("c") == 38
assert decode("d") == 39
assert decode("e") == 40
assert decode("f") == 41
assert decode("g") == 42
assert decode("h") == 43
assert decode("i") == 44
assert decode("j") == 45
assert decode("k") == 46
assert decode("l") == 47
assert decode("m") == 48
assert decode("n") == 49
assert decode("o") == 50
assert decode("p") == 51
assert decode("q") == 52
assert decode("r") == 53
assert decode("s") == 54
assert decode("t") == 55
assert decode("u") == 56
assert decode("v") == 57
assert decode("w") == 58
assert decode("x") == 59
assert decode("y") == 60
assert decode("z") == 61
assert decode("10") == 62
assert decode("1c") == 100
assert decode("20") == 124
assert decode("zzzzzz") == 56_800_235_583
end
end
1 change: 1 addition & 0 deletions test/test_helper.exs
@@ -0,0 +1 @@
ExUnit.start

0 comments on commit 7606cf0

Please sign in to comment.