defmodule Hexzip do @moduledoc false alias Hexzip.W alias Krug.StringUtil @zero 0 def y(w,z) do h(w,z |> W.z(),z |> W.y(),w()) end def x(k,z) do cond do (h() |> h(k) or (k |> z()) < 2) -> k (h() |> h(z) or !(z > w())) -> k (z |> rem(k |> z()) |> h(w())) -> k true -> x(k,z |> rem(k |> z()),w()) end end def w(y,z) do x = z |> W.z() w = z |> W.y() z(y,x,w,w |> w()) end defp z(v,k) do v |> Enum.at(k) end defp h(z,v,w,s) do cond do (s >= z(w)) -> z true -> z |> z(z(w,s),z(v,s)) |> h(v,w,s + 1) end end defp y(y) do y |> Enum.reverse() end defp h() do nil end defp z(z,p,a,x) do cond do (x < w()) -> z true -> z |> z(z(p,x),z(a,x)) |> z(p,a,x - 1) end end defp h(y,h) do h == y end defp z(z) do z |> length() end defp x(r,w,y) do cond do (y >= w) -> r true -> x(r) |> x(w,y + 1) end end defp w(w) do (w |> z()) - 1 end defp w() do @zero end defp z(w,x,y) do w |> StringUtil.replace(x,y,true) end defp x(y) do y = y |> y() [(y |> hd()) | (y |> tl() |> y())] end end