d61f2de7b3dce93c9b8914fb980224437d0ea4207787caab9098041cf5bfe896.tri (779B)
1 !import base * 2 !export * 3 4 -- Ordered predicate/action rows. Each row is exactly [predicate action]. 5 -- First match wins; no match or a malformed reached row returns Leaf. 6 -- Unselected actions and subsequent rows are not evaluated. 7 match value rules = (let rec 8 walk remaining = case remaining of 9 [rule | rest] = (case rule of 10 [test action] = (case test value of 11 t = walk rest 12 _ = action value) 13 _ = t) 14 _ = t 15 in walk rules) 16 17 otherwise = const true 18 19 -- guard stores thunks, rather than a predicate/action on a shared value. 20 cond rules = (let rec 21 walk remaining = case remaining of 22 [(testK, actionK) | rest] = (case testK t of 23 t = walk rest 24 _ = actionK t) 25 _ = t 26 in walk rules) 27 28 guard testK actionK = pair testK actionK