|
1566 | 1566 |
|
1567 | 1567 | ```nickel
|
1568 | 1568 | ('foo | std.enum.Tag) =>
|
1569 |
| - `foo |
| 1569 | + 'foo |
1570 | 1570 | ('FooBar | std.enum.Tag) =>
|
1571 |
| - `FooBar |
| 1571 | + 'FooBar |
1572 | 1572 | ("tag" | std.enum.Tag) =>
|
1573 | 1573 | error
|
1574 | 1574 | ```
|
1575 | 1575 | "%
|
1576 | 1576 | = std.contract.from_predicate is_enum_tag,
|
1577 | 1577 |
|
| 1578 | + Enum |
| 1579 | + | doc m%" |
| 1580 | + Enforces that the value is an enum (either a tag or a variant). |
| 1581 | + |
| 1582 | + # Examples |
| 1583 | + |
| 1584 | + ```nickel |
| 1585 | + ('Foo | std.enum.Enum) => |
| 1586 | + 'Foo |
| 1587 | + ('Bar 5 | std.enum.Enum) => |
| 1588 | + 'Bar 5 |
| 1589 | + ("tag" | std.enum.Enum) => |
| 1590 | + error |
| 1591 | + "% |
| 1592 | + = std.contract.from_predicate std.is_enum, |
| 1593 | + |
1578 | 1594 | TagOrString
|
1579 | 1595 | | doc m%%"
|
1580 | 1596 | Accepts both enum tags and strings. Strings are automatically
|
|
1670 | 1686 | ```
|
1671 | 1687 | "%
|
1672 | 1688 | = fun value => %enum/is_variant% value,
|
| 1689 | + |
| 1690 | + to_tag_and_arg |
| 1691 | + | Enum -> { tag | String, arg | optional } |
| 1692 | + | doc m%" |
| 1693 | + Convert an enum to record with a string tag and an optional argument. If |
| 1694 | + the enum is an enum tag, the `arg` field is simply omitted. |
| 1695 | + |
| 1696 | + `std.enum.from_tag_and_arg` provides the inverse transformation, |
| 1697 | + reconstructing an enum from a string tag and an argument. |
| 1698 | + |
| 1699 | + # Examples |
| 1700 | + |
| 1701 | + ```nickel |
| 1702 | + std.enum.to_tag_and_arg ('Foo "arg") => |
| 1703 | + { tag = "Foo", arg = "arg" } |
| 1704 | + std.enum.to_tag_and_arg 'http |
| 1705 | + => { tag = "http" } |
| 1706 | + ``` |
| 1707 | + "% |
| 1708 | + = fun enum_value => |
| 1709 | + let tag_string = %to_string% (%enum/get_tag% enum_value) in |
| 1710 | + if %enum/is_variant% enum_value then |
| 1711 | + { |
| 1712 | + tag = tag_string, |
| 1713 | + arg = %enum/get_arg% enum_value, |
| 1714 | + } |
| 1715 | + else |
| 1716 | + { tag = tag_string }, |
| 1717 | + |
| 1718 | + from_tag_and_arg |
| 1719 | + | { tag | String, arg | optional } -> Enum |
| 1720 | + | doc m%" |
| 1721 | + Create an enum from a string tag and an optional argument. If the `arg` |
| 1722 | + field is omitted, a bare enum tag is created. |
| 1723 | + |
| 1724 | + `std.enum.to_tag_and_value` provides the inverse transformation, |
| 1725 | + extracting a string tag and an argument from an enum. |
| 1726 | + |
| 1727 | + # Examples |
| 1728 | + |
| 1729 | + ```nickel |
| 1730 | + std.enum.from_tag_and_arg { tag = "Foo", arg = "arg" } |
| 1731 | + => ('Foo "arg") |
| 1732 | + std.enum.from_tag_and_arg { tag = "http" } |
| 1733 | + => 'http |
| 1734 | + ``` |
| 1735 | + "% |
| 1736 | + = fun enum_data => |
| 1737 | + if %record/has_field% "arg" enum_data then |
| 1738 | + %enum/make_variant% enum_data.tag enum_data.arg |
| 1739 | + else |
| 1740 | + %enum/from_string% enum_data.tag, |
| 1741 | + |
| 1742 | + map |
| 1743 | + | (Dyn -> Dyn) -> Enum -> Enum |
| 1744 | + | doc m%" |
| 1745 | + Maps a function over an enum variant's argument. If the enum doesn't |
| 1746 | + have an argument, it is left unchanged. |
| 1747 | + |
| 1748 | + # Examples |
| 1749 | + |
| 1750 | + ```nickel |
| 1751 | + std.enum.map ((+) 1) ('Foo 42) |
| 1752 | + => 'Foo 43 |
| 1753 | + std.enum.map f 'Bar |
| 1754 | + => 'Bar |
| 1755 | + ``` |
| 1756 | + "% |
| 1757 | + = fun f enum_value => |
| 1758 | + if %enum/is_variant% enum_value then |
| 1759 | + let tag = (%to_string% (%enum/get_tag% enum_value)) in |
| 1760 | + let mapped = f (%enum/get_arg% enum_value) in |
| 1761 | + |
| 1762 | + %enum/make_variant% tag mapped |
| 1763 | + else |
| 1764 | + enum_value, |
1673 | 1765 | },
|
1674 | 1766 |
|
1675 | 1767 | function = {
|
|
0 commit comments