View Source Pathex.Combinator(Pathex v2.0.0)

Combinator for lenses Read `Pathex.Combinator.combine/1` documentation

Functions

This function creates a recursive path from path defined in `path_func` Consider this example

combine(path_func, max_depth \\ :infinity)

View Source
`@spec combine((Pathex.t() -> Pathex.t()), pos_integer() | :infinity) :: Pathex.t()`

This function creates a recursive path from path defined in `path_func` Consider this example

``````iex> import Pathex; import Pathex.Lenses
iex> recursive_xpath = combine(fn recursive_xpath ->
iex>   path(:x)            # Takes by :x key
iex>   ~> recursive_xpath  # If taken, calls itself
iex>   ||| matching(_)     # Otherwise returns current structure
iex> end)
iex>
iex> Pathex.view!(%{x: %{x: %{x: %{x: 1}}}}, recursive_xpath)
1
iex> Pathex.set!(%{x: %{x: %{x: %{x: 1}}}}, recursive_xpath, 2)
%{x: %{x: %{x: %{x: 2}}}}``````

The second argument of this function specifies the maximum depth. It's infinity be default, but you can specify this as any positive integer. It is useful when you're developing lens and you're not sure whether the lens will or won't loop.

For example

``````# Combinator lens with limit
limited = combine(fn rec -> path(:x) ~> rec end, 100_000)
:error = Pathex.force_set(%{x: 1}, limited, 123)

# And this is without limit
unlimited = combine(fn rec -> path(:x) ~> rec end)
Pathex.force_set(%{x: 1}, unlimited, 123) # Inifinite loop``````