# Juice
[![Build Status](https://circleci.com/gh/rupurt/juice.png)](https://circleci.com/gh/rupurt/juice)
Reduce in memory data structures using a lightweight query language
## Installation
Add `juice` to your list of dependencies in `mix.exs`
```elixir
def deps do
[
{:juice, "~> 0.0.3"}
]
end
```
## Usage
Juice can collect and reject string or atom keys from an Elixir [Map](https://hexdocs.pm/elixir/Map.html) or [List](https://hexdocs.pm/elixir/List.html).
Given the map
```elixir
iex> fruit_basket = %{
apples: {
granny_smith: 10,
golden_delicious: 3
},
"oranges" => 5,
plums: 6,
"mangos" => 2,
recipients: [:steph, "michael", :lebron, "charles"]
}
```
Return everything with a wildcard `*`
```elixir
iex> Juice.squeeze(fruit_basket, "*") == %{
apples: {
granny_smith: 10,
golden_delicious: 3
},
"oranges" => 5,
plums: 6,
"mangos" => 2,
recipients: [:steph, "michael", :lebron, "charles"]
}
```
Remove `plums` and `mangos`
```elixir
iex> Juice.squeeze(fruit_basket, "* -plums -mangos") == %{
apples: {
granny_smith: 10,
golden_delicious: 3
},
"oranges" => 5,
recipients: [:steph, "michael", :lebron, "charles"]
}
```
Only collect `granny_smith` `apples` and `oranges` with nested `.` notation
```elixir
iex> Juice.squeeze(fruit_basket, "apples.granny_smith oranges") == %{
apples: {
granny_smith: 10,
},
"oranges" => 5
}
```
Collect `plums` and `mangos` for `charles`
```elixir
iex> Juice.squeeze(fruit_basket, "plums mangos recipients.charles") == %{
plums: 6,
"mangos" => 2,
recipients: ["charles"]
}
```