# `JSCalendar.RecurrenceRule`
[🔗](https://github.com/elixir-tempo/jscalendar/blob/v0.1.0/lib/jscalendar/parts.ex#L133)

A repeat pattern
([RFC 8984 §4.3.3](https://www.rfc-editor.org/rfc/rfc8984.html#section-4.3.3)).

This is JSCalendar's rendering of an iCalendar `RRULE`, with the
parts named rather than packed into a string. `by_month` is a string
rather than a number because a leap month in a lunisolar calendar is
written `"3L"`.

# `t`

```elixir
@type t() :: %JSCalendar.RecurrenceRule{
  by_day: [JSCalendar.NDay.t()] | nil,
  by_hour: [non_neg_integer()] | nil,
  by_minute: [non_neg_integer()] | nil,
  by_month: [String.t()] | nil,
  by_month_day: [integer()] | nil,
  by_second: [non_neg_integer()] | nil,
  by_set_position: [integer()] | nil,
  by_week_no: [integer()] | nil,
  by_year_day: [integer()] | nil,
  count: non_neg_integer() | nil,
  extra: map(),
  first_day_of_week: String.t(),
  frequency: String.t() | nil,
  interval: pos_integer(),
  rscale: String.t(),
  skip: String.t(),
  until: NaiveDateTime.t() | nil
}
```

# `from_map`

```elixir
@spec from_map(map()) :: {:ok, struct()} | {:error, term()}
```

Read this object from a decoded JSON map.

### Arguments

* `map` is a map with string keys, as `:json.decode/1` returns.

### Returns

* `{:ok, object}`; or

* `{:error, reason}` when a property does not match its declared
  type.

# `jscalendar_type`

```elixir
@spec jscalendar_type() :: String.t()
```

The `@type` value RFC 8984 gives this object.

### Returns

* the type name as a string.

# `to_map`

```elixir
@spec to_map(struct()) :: map()
```

Write this object back to a JSON-ready map.

### Arguments

* `object` is a `t:t/0`.

### Returns

* a map with string keys, ready for `:json.encode/1`.

---

*Consult [api-reference.md](api-reference.md) for complete listing*
