Algebraic data types: Difference between revisions
Content added Content deleted
m (→{{header|Nim}}) |
m (Added some empty lines.) |
||
Line 1,269: | Line 1,269: | ||
</pre> |
</pre> |
||
=={{header|Nim}}== |
=={{header|Nim}}== |
||
{{libheader|fusion/matching}} |
|||
<lang nim>import fusion/matching |
<lang nim>import fusion/matching |
||
{.experimental: "caseStmtMacros".} |
{.experimental: "caseStmtMacros".} |
||
type |
type |
||
Colour = enum Empty, Red, Black |
Colour = enum Empty, Red, Black |
||
Line 1,277: | Line 1,279: | ||
left, right: RBTree[T] |
left, right: RBTree[T] |
||
value: T |
value: T |
||
proc `[]`[T](r: RBTree[T], idx: static[FieldIndex]): auto = |
proc `[]`[T](r: RBTree[T], idx: static[FieldIndex]): auto = |
||
## enables tuple syntax for unpacking and matching |
## enables tuple syntax for unpacking and matching |
||
Line 1,283: | Line 1,286: | ||
elif idx == 2: r.value |
elif idx == 2: r.value |
||
elif idx == 3: r.right |
elif idx == 3: r.right |
||
template B[T](l: untyped, v: T, r): RBTree[T] = |
template B[T](l: untyped, v: T, r): RBTree[T] = |
||
RBTree[T](colour: Black, left: l, value: v, right: r) |
RBTree[T](colour: Black, left: l, value: v, right: r) |
||
template R[T](l: untyped, v: T, r): RBTree[T] = |
template R[T](l: untyped, v: T, r): RBTree[T] = |
||
RBTree[T](colour: Red, left: l, value: v, right: r) |
RBTree[T](colour: Red, left: l, value: v, right: r) |
||
Line 1,296: | Line 1,301: | ||
(Black, @a, @x, (Red, @b, @y, (Red, @c, @z, @d))): |
(Black, @a, @x, (Red, @b, @y, (Red, @c, @z, @d))): |
||
t = R(B(a, x, b), y, B(c, z, d)) |
t = R(B(a, x, b), y, B(c, z, d)) |
||
proc balance*[T](t: var RBTree[T]) = balImpl[T](t) |
proc balance*[T](t: var RBTree[T]) = balImpl[T](t) |
||
Line 1,304: | Line 1,310: | ||
of (value: > x): t.left.ins(x); t.balance() |
of (value: > x): t.left.ins(x); t.balance() |
||
of (value: < x): t.right.ins(x); t.balance() |
of (value: < x): t.right.ins(x); t.balance() |
||
proc insert*[T](tt: var RBTree[T], xx: T) = |
proc insert*[T](tt: var RBTree[T], xx: T) = |
||
proc ins(t: var RBTree[T], x: T) = insImpl[T](t, x) |
proc ins(t: var RBTree[T], x: T) = insImpl[T](t, x) |