Skip to main content

sim_lib_sequence/
claims.rs

1use sim_kernel::{
2    Cx, LibId, OpKey, Result, Symbol,
3    standard::{publish_organ_claims, publish_organ_claims_for_lib},
4};
5
6use crate::runtime::SeqOp;
7
8/// Symbol naming the sequence organ as a claim subject.
9///
10/// Identifies this crate's behavior in the kernel claim store so the organ and
11/// its operations project into a browse Card.
12pub fn sequence_organ_symbol() -> Symbol {
13    Symbol::qualified("organ", "sequence")
14}
15
16/// Operation key for persistent sequence construction.
17pub fn sequence_persistent_op_key() -> OpKey {
18    sequence_op_key("persistent")
19}
20
21/// Operation key for lazy sequence construction.
22pub fn sequence_lazy_op_key() -> OpKey {
23    sequence_op_key("lazy")
24}
25
26/// Operation key for sequence mapping.
27pub fn sequence_map_op_key() -> OpKey {
28    sequence_op_key("map")
29}
30
31/// Operation key for sequence filtering.
32pub fn sequence_filter_op_key() -> OpKey {
33    sequence_op_key("filter")
34}
35
36/// Operation key for sequence reduction.
37pub fn sequence_reduce_op_key() -> OpKey {
38    sequence_op_key("reduce")
39}
40
41/// Operation key for sequence iteration (`for-each`).
42pub fn sequence_for_op_key() -> OpKey {
43    sequence_op_key("for")
44}
45
46/// Operation key for transducer-driven sequence pipelines.
47pub fn sequence_transduce_op_key() -> OpKey {
48    sequence_op_key("transduce")
49}
50
51/// All sequence-surface operations this crate models, whether or not they are
52/// currently exported as live runtime callables.
53///
54/// The canonical operation set published with
55/// [`publish_sequence_organ_claims`].
56pub fn sequence_declared_op_keys() -> Vec<OpKey> {
57    [
58        sequence_persistent_op_key(),
59        sequence_lazy_op_key(),
60        sequence_map_op_key(),
61        sequence_filter_op_key(),
62        sequence_reduce_op_key(),
63        sequence_for_op_key(),
64        sequence_transduce_op_key(),
65    ]
66    .into()
67}
68
69/// Live sequence claim-to-export mappings backed by the loaded runtime surface.
70pub fn sequence_live_ops() -> Vec<(OpKey, Symbol)> {
71    vec![
72        (sequence_map_op_key(), SeqOp::Map.symbol()),
73        (sequence_filter_op_key(), SeqOp::Filter.symbol()),
74        (sequence_reduce_op_key(), SeqOp::Fold.symbol()),
75    ]
76}
77
78/// Operation keys the sequence organ currently publishes as live claims.
79pub fn sequence_op_keys() -> Vec<OpKey> {
80    sequence_live_ops()
81        .into_iter()
82        .map(|(op_key, _export_symbol)| op_key)
83        .collect()
84}
85
86/// Publish the sequence organ and its operation keys into the claim store.
87///
88/// Realizes the kernel organ-claim contract for this crate: the kernel defines
89/// claim and Card contracts, this records the concrete sequence organ so it is
90/// discoverable. See the [crate README](https://github.com/sim-nest/sim-runtime).
91pub fn publish_sequence_organ_claims(cx: &mut Cx) -> Result<()> {
92    publish_organ_claims(cx, sequence_organ_symbol(), sequence_op_keys())
93}
94
95/// Publish the sequence organ claims as part of a loaded lib receipt.
96pub fn publish_sequence_organ_claims_for_lib(cx: &mut Cx, lib_id: LibId) -> Result<()> {
97    publish_organ_claims_for_lib(cx, lib_id, sequence_organ_symbol(), sequence_op_keys())
98}
99
100fn sequence_op_key(name: &str) -> OpKey {
101    OpKey::new(Symbol::new("sequence"), Symbol::new(name), 1)
102}