Algebraic data types: Difference between revisions

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