       iex> String.split(" foo bar ")
       ["foo", "bar"]
 
+  """
+  @spec split(t) :: [t]
+  defdelegate split(binary), to: String.Unicode
+
+  @doc """
+  Divides a string into sub strings based on a pattern,
+  returning a list of these sub string. The pattern can
+  be a string, a list of strings or a regular expression.
+
+  The string is split into as many parts as possible by
+  default, unless the `global` option is set to false.
+
+  ## Examples
+
       iex> String.split("a,b,c", ",")
       ["a", "b", "c"]
       iex> String.split("a,b,c", ",", global: false)

      ["a,b"]

  """
  @spec split(t) :: [t]
  @spec split(t, t | [t] | Regex.t) :: [t]
  @spec split(t, t | [t] | Regex.t, Keyword.t) :: [t]

  defdelegate split(binary), to: String.Unicode

  def split(binary, pattern, options // [])

  def split(binary, pattern, options) when is_regex(pattern) do

  def printable?(_),    do: false

  @doc """
  Splits a string on sub strings at each Unicode whitespace
  occurrence with leading and trailing whitespace ignored.

  ## Examples

