Algebraic data types: Difference between revisions

Content added Content deleted
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)