README.livemd

<!-- livebook:{"persist_outputs":true} -->

# IceCream

## Section

IceCream is a port of the [python package](https://github.com/gruns/icecream) of the same name.

#### Never use `IO.inspect()` again

Use IceCream to inspect any Elixir term with an automatically generated label.

![Example Usage](./screen-shot.png)

## Installation

The package can be installed by adding `ice_cream` to your list of dependencies in `mix.exs` . It should only be added for the `dev` and `test` environments.

```
def deps do
  [
    {:ice_cream, "~> 0.0.5", only: [:dev, :test]}
  ]
end
```

The docs can be found at [https://hexdocs.pm/ice_cream](https://hexdocs.pm/ice_cream).

## Usage

Use IceCream in place of `IO.inspect/2` . So write `ic(value)` instead of
 `IO.inspect(some_value, label: "some_value")`

It can also be used inside of pipelines. You can write:

```elixir
Mix.install([{:ice_cream, path: "./"}])
```

```output
:ok
```

```elixir
defmodule SomeModule do
  import IceCream

  defp fabricate(data), do: data
  defp cleanup(data), do: data

  def some_fun(data) do
    data
    |> ic()
    |> fabricate()
    |> ic()
    |> cleanup()
    |> ic()
  end
end

SomeModule.some_fun("<data>")
```

```output
ic| data: "<data>"
ic| fabricate(data): "<data>"
ic| cleanup(fabricate(data)): "<data>"
```

```output
"<data>"
```

Instead of:

```elixir
defmodule SomeModule do
  defp fabricate(data), do: data
  defp cleanup(data), do: data

  def some_fun(data) do
    data
    |> IO.inspect(label: "data")
    |> fabricate()
    |> IO.inspect(label: "fabricate")
    |> cleanup()
    |> IO.inspect(label: "cleanup")
  end
end

SomeModule.some_fun("<data>")
```

```output
data: "<data>"
fabricate: "<data>"
cleanup: "<data>"
```

```output
"<data>"
```

If in a function, you can pass `:location` and `:function` as options

```elixir
defmodule SomeModule do
  import IceCream

  def some_fun(data) do
    ic(data, function: true, location: true)
  end
end

SomeModule.some_fun("<data>")
```

```output
ic| README.livemd#cell:5 in SomeModule.some_fun/1 data: "<data>"
```

```output
"<data>"
```

It also works if you pass in a function call

```elixir
import IceCream
ic(:math.pow(2, 3))
```

```output
ic| :math.pow(2, 3): 8.0
```

```output
8.0
```

## Configuration

Default options are configurable.

In addition to `location` and `function` , any of the [Inspect options](https://hexdocs.pm/elixir/Inspect.Opts.html) can be set, such as `:limit`

```
# config/dev.exs
config :ice_cream,
  location: true,
  function: true,
  limit: :infinity
```