Serene Runtime 1.0.0
C runtime for the Serene programming language
Loading...
Searching...
No Matches
seqs.h File Reference
#include "serene/rt/core.h"
#include "serene/rt/impl/seq.h"
Include dependency graph for seqs.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Data Structures

struct  srn_seq_t
 A persistent, immutable, indexed sequence. More...
 

Typedefs

typedef struct srn_seq_t srn_seq_t
 A persistent, immutable, indexed sequence.
 

Functions

srn_value_tsrn_seq_empty (srn_context_t *ctx, srn_metadata_t *metadata)
 
srn_value_tsrn_seq_conj (srn_context_t *ctx, srn_metadata_t *metadata, srn_value_t *seq, srn_value_t *value)
 

Typedef Documentation

◆ srn_seq_t

typedef struct srn_seq_t srn_seq_t

A persistent, immutable, indexed sequence.

Backed by the bit-partitioned trie implementation in serene/rt/impl/seq.h.

Function Documentation

◆ srn_seq_conj()

srn_value_t * srn_seq_conj ( srn_context_t * ctx,
srn_metadata_t * metadata,
srn_value_t * seq,
srn_value_t * value )

Definition at line 39 of file seqs.c.

40 {
41 PANIC_IF_NULL(ctx);
42 PANIC_IF_NULL(seq);
43 PANIC_IF_NULL(value);
44
45 if (!IS_A(seq, VSeq)) {
46 return srn_errors_make_error(ctx, metadata, ABSURD, "expected a seq");
47 }
48 srn_seq_t *old = AS_SEQ(seq);
49 srn_seq_t *neu = ALLOC(ctx, srn_seq_t);
50 neu->inner = seq_push(ctx, &old->inner, (seq_elem_t)value);
51 if (neu->inner.maybe_error != nullptr) {
52 return srn_errors_err_to_value(ctx, metadata, neu->inner.maybe_error);
53 }
54 return srn_value_make(ctx, VSeq, metadata, (void *)neu);
55}
#define ALLOC(ctx, T)
Definition context.h:82
srn_value_t * srn_value_make(srn_context_t *ctx, srn_value_tag_t tag, srn_metadata_t *metadata, void *payload)
Creates a new serene value.
Definition core.c:24
@ VSeq
Definition core.h:119
#define AS_SEQ(value_ref)
Definition core.h:176
#define IS_A(value_ref, field)
Definition core.h:162
@ ABSURD
Definition errors.h:45
seq_t seq_push(const srn_context_t *ctx, const seq_t *seq, seq_elem_t x)
Definition seq.c:87
void * seq_elem_t
We use generic pointers to refer to internal nodes, leaf nodes and even elements.
Definition seq.h:131
A persistent, immutable, indexed sequence.
Definition seqs.h:27
seq_t inner
Definition seqs.h:28
#define PANIC_IF_NULL(ptr)
Definition utils.h:64
Here is the call graph for this function:

◆ srn_seq_empty()

srn_value_t * srn_seq_empty ( srn_context_t * ctx,
srn_metadata_t * metadata )

Definition at line 26 of file seqs.c.

26 {
27 PANIC_IF_NULL(ctx);
28
29 srn_seq_t *s = ALLOC(ctx, srn_seq_t);
30 s->inner = seq_empty(ctx);
31
32 if (s->inner.maybe_error != nullptr) {
33 return srn_errors_err_to_value(ctx, metadata, s->inner.maybe_error);
34 }
35
36 return srn_value_make(ctx, VSeq, metadata, (void *)s);
37}
seq_t seq_empty(const srn_context_t *ctx)
Definition seq.c:76
Here is the call graph for this function: