defmodule QRCode.Bits do def reverse(bin), do: reverse(bin, <<>>) defp reverse(<>, acc), do: reverse(bin, <>) defp reverse(<<>>, acc), do: acc def duplicate(bin, n), do: duplicate(bin, n, <<>>) defp duplicate(bin, n, acc) when n > 0, do: duplicate(bin, n - 1, <>) defp duplicate(_, 0, acc), do: acc def append(list), do: append(list, <<>>) defp append([h|t], acc), do: append(t, <>) defp append([], acc), do: acc def binlist(bin), do: binlist(bin, []) defp binlist(<>, acc), do: binlist(bin, [x | acc]) defp binlist(<<>>, acc), do: Enum.reverse(acc) def bitstring(bin), do: bitstring(bin, <<>>) defp bitstring(<<0 :: size(1), bin :: bitstring>>, acc), do: bitstring(bin, <>) defp bitstring(<<1 :: size(1), bin :: bitstring>>, acc), do: bitstring(bin, <>) defp bitstring(<<>>, acc), do: acc def stringbits(bin), do: stringbits(bin, <<>>) defp stringbits(<>, acc), do: stringbits(bin, <>) defp stringbits(<>, acc), do: stringbits(bin, <>) defp stringbits(<<>>, acc), do: acc end