consumer_worker_abi.tri (1929B)
1 -- Descriptor ABI: target defaults and explicit state are separate entry modes. 2 !import "consumers.lexical-worker" L 3 !import "consumers.structural" S 4 !import "prelude" !Local 5 6 rule input state output = S.makeRule input state output 7 targetIR = S.makeConsumer 11 [(rule S.patAny (S.patCapture 0) (S.outCapture 0))] 8 target = resultOr t (L.lCompile targetIR) 9 10 -- The caller state (99) is distinct from the target default (11). 11 stateIR = S.makeConsumer (pair 99 target) [(rule S.patAny 12 (S.patFork (S.patCapture 0) (S.patCapture 1)) 13 (S.outCall (S.outCapture 1) (S.outLiteral 7) 2 (S.outCapture 2)))] 14 stateWorker = resultOr t (L.lCompile stateIR) 15 inputIR = S.makeConsumer 99 [(rule (S.patCapture 0) S.patAny 16 (S.outCall (S.outCapture 0) (S.outLiteral 7) 1 (S.outCapture 1)))] 17 inputWorker = resultOr t (L.lCompile inputIR) 18 19 -- An authored literal may be an already prepared worker: do not validate its 20 -- payload as SCP syntax. The returned worker is then invoked by the caller. 21 providerIR = S.makeConsumer t [(rule S.patAny S.patAny (S.outLiteral target))] 22 provider = resultOr t (L.lCompile providerIR) 23 returnedIR = S.makeConsumer t [(rule S.patAny S.patAny 24 (S.outCall (S.outLiteral provider) (S.outLiteral t) 0 25 (S.outCall (S.outCapture 0) (S.outLiteral 7) 1 (S.outCapture 1))))] 26 returnedWorker = resultOr t (L.lCompile returnedIR) 27 28 checks = foldl and? true [ 29 (L.lWorkerShape? target) 30 (not? (L.lWorkerShape? t)) 31 (not? (L.lWorkerShape? (pair 0 t))) 32 (equal? (L.lRunChecked target 7) (ok 11 t)) 33 (equal? (L.lRunOpenChecked target 7 19) (ok 19 t)) 34 (equal? (L.lRunChecked stateWorker 7) (ok 11 t)) 35 (equal? (L.lRunChecked inputWorker target) (ok 11 t)) 36 (equal? (L.lRunChecked returnedWorker 7) (ok 11 t)) 37 (equal? (L.lRunChecked t 7) (err "invalid SCP worker" t)) 38 (equal? (L.lRunOpenChecked t 7 19) (err "invalid SCP worker" t))] 39 main = matchBool "consumer-worker-abi-ok" "consumer-worker-abi-DIFFER" checks 40 main