1 import Base 2 import ./world.bend as W 3 import ./entity_key_render.bend as KeyRender 4 import ./trace_facts.bend as Facts 5 6 def error(error:W.WorldError) -> String: 7 match error: 8 case W.MissingEntity{}:"MissingEntity" 9 case W.CapacityExceeded{}:"CapacityExceeded" 10 case W.NamespaceExhausted{}:"NamespaceExhausted" 11 case W.SystemIdExhausted{}:"SystemIdExhausted" 12 def handle(~S:Data,target:W.Handle) -> String: 13 match target: 14 case W.Handle{namespace,key}:U32.show(namespace) ++ ":" ++ KeyRender.show(key) 15 def deferred(~S:Data,state:Facts.State,key:String,operation:Facts.Operation,target:W.Handle,result:Facts.FactResult) -> Facts.State: 16 match state: 17 case Facts.Off{}:Facts.Off{} 18 case Facts.On{facts}:Facts.On{Facts.Fact{Facts.DeferredCommand{},key,operation,Some{handle(~S,target)},Facts.OpaqueValue{},Facts.OpaqueValue{},result} <> facts} 19 def applied(~S:Data,state:Facts.State,key:String,target:W.Handle,status:W.Status) -> Facts.State: 20 match state status: 21 case Facts.Off{} _:Facts.Off{} 22 case state W.Accepted{}:deferred(~S,state,key,Facts.ApplyOperation{},target,Facts.Applied{}) 23 case state W.Rejected{why}:deferred(~S,state,key,Facts.ApplyOperation{},target,Facts.Refused{error(why)})