﻿:: { te:(), ts:(s), t:(i4, b, s), qt:(i4, b, s)?, st:(i4, b, s)*, sqt:(i4, b, s)?* }

() & ()
() & te
() & (3,)
() & (3, true)
() & t
() & qt
() & st
() & sqt

te & ()
te & te
te & (3,)
te & (3, true)
te & t
te & qt
te & st
te & sqt

("hi",) & ()
("hi",) & te
("hi",) & (3,)
("hi",) & (3, true)
("hi",) & t
("hi",) & qt
("hi",) & st
("hi",) & sqt

t & ()
t & te
t & (3,)
t & (3, true)
t & t
t & qt
t & st
t & sqt

qt & ()
qt & te
qt & (3,)
qt & (3, true)
qt & t
qt & qt
qt & st
qt & sqt

st & ()
st & te
st & (3,)
st & (3, true)
st & t
st & qt
st & st
st & sqt

sqt & ()
sqt & te
sqt & (3,)
sqt & (3, true)
sqt & t
sqt & qt
sqt & st
sqt & sqt

// Swap left and right.

() & ()
te & ()
(3,) & ()
(3, true) & ()
t & ()
qt & ()
st & ()
sqt & ()

() & te
te & te
(3,) & te
(3, true) & te
t & te
qt & te
st & te
sqt & te

() & ("hi",)
te & ("hi",)
(3,) & ("hi",)
(3, true) & ("hi",)
t & ("hi",)
qt & ("hi",)
st & ("hi",)
sqt & ("hi",)

() & t
te & t
(3,) & t
(3, true) & t
t & t
qt & t
st & t
sqt & t

() & qt
te & qt
(3,) & qt
(3, true) & qt
t & qt
qt & qt
st & qt
sqt & qt

() & st
te & st
(3,) & st
(3, true) & st
t & st
qt & st
st & st
sqt & st

() & sqt
te & sqt
(3,) & sqt
(3, true) & sqt
t & sqt
qt & sqt
st & sqt
sqt & sqt

// Other patterns.

("hi",) & () & ("end",)
("hi",) & te & ("end",)
("hi",) & (3,) & ("end",)
("hi",) & (3, true) & ("end",)
("hi",) & t & ("end",)
("hi",) & qt & ("end",)
("hi",) & st & ("end",)
("hi",) & sqt & ("end",)

("hi",) & () & ts
("hi",) & te & ts
("hi",) & (3,) & ts
("hi",) & (3, true) & ts
("hi",) & t & ts
("hi",) & qt & ts
("hi",) & st & ts
("hi",) & sqt & ts

ts & ("hi",) & (3,)

("hi",) & ("a" if true else "b",) & (3, true)

// Error cases.

t & null
null & t
t & "hi"
"hi" & t
t & true
true & t
