::: {A:i8*, B:i8?*, X:i4, b:b, R:{X:i4, Y:i2, S:{X:i4}*}*, SV:v* }

TakeIf(a : A, a > 100)
DropIf(a : A, [if] a > 100)
TakeIf(b : B, [if] b > 100)
DropIf(b : B, b > 100)

TakeIf(a : A, [while] a > 100) // Error.
TakeIf([if] a : A, a > 100) // Error.
TakeIf(a : A, [else] a > 100) // Error.

TakeIf(x : "hello", true)
TakeIf(x : A, true)
TakeIf(x : A, false)
TakeIf(x : A, null)
DropIf(x : "hello", true)
DropIf(x : A, true)
DropIf(x : A, false)
DropIf(x : A, null)

Take(A, 5)
Drop(A, 5)
Take(a : A, 5, [if] a > 100)
Take(a : A, 5, [while] a > 100)
Drop(a : A, 5, a > 100)

Take(a : A, [else] X) // Error.
Take(a : A, 5, [else] a > 100) // Error.
Take(a : A, [if] 5, a > 100) // Error.

Take(A, X)
Drop(A, X)
Take(a : A, X, a > 100)
Drop(a : A, X, [if] a > 100)
Take(a : A, X, [while] a > 100)
Drop(a : A, X, [while] a > 100)

Take(R, X)
Drop(R, X)
Take(R, X, X > Y)
Drop(R, X, X > Y)

Take(R, [if]  b)
Drop(R, [if]  b)
Take(R, [if]  true)
Drop(R, [if]  true)
Take(R, [if]  false)
Drop(R, [if]  false)
Take(R, [while]  b)
Drop(R, [while]  b)
Take(R, [while]  true)
Drop(R, [while]  true)
Take(R, [while]  false)
Drop(R, [while]  false)

Take(null, X)
Take([], X)
Take([], X, b)
Take(null, [if] b)
Take(null, [while] b)
Take([], [if] b)
Take([], [while] b)
Take([], X, [if] b)
Take([], X, [while] b)
Drop(null, X)
Drop([], X)
Drop([], X, b)
Drop(null, [if] b)
Drop(null, [while] b)
Drop([], [if] b)
Drop([], [while] b)
Drop([], X, [if] b)
Drop([], X, [while] b)
Take(A, 0)
Take(A, 0, b)
Take(A, [if] b)
Take(A, [while] b)
Take(A, 0, [if] b)
Take(A, 0, [while] b)
Drop(A, 0)
Drop(A, 0, b)
Drop(A, [if] b)
Drop(A, [while] b)
Drop(A, 0, [if] b)
Drop(A, 0, [while] b)
Take(A, X, true)
Take(A, X, false)
Take(A, [if] true)
Take(A, [if] false)
Take(A, [while] true)
Take(A, [while] false)
Take(A, X, [while] true)
Take(A, X, [while] false)
Drop(A, X, true)
Drop(A, X, false)
Drop(A, [if] true)
Drop(A, [if] false)
Drop(A, [while] true)
Drop(A, [while] false)
Drop(A, X, [while] true)
Drop(A, X, [while] false)

// REVIEW: We can do better on many of these. WI #41183.
TakeIf(A, true)
TakeIf(A, false)
DropIf(A, true)
DropIf(A, false)
TakeIf([], b) 
DropIf([], b)
DropOne([])
DropOne(A, true)
DropOne(A, false)
DropOne([], b)
