/**
 * @file include/str.h
 */

#pragma once
#include "gene.h"
#include <stddef.h>

#define dropslice ondrop(freeMutSlice)

typedef struct {
  char *s;
  size_t len;
  size_t cap;
  bool owned;
} mut_slice_t;

/**
 * @brief Refer to somewhere
 */
typedef struct {
  char const *s;
  size_t len;
} slice_t;

MAP(DEF_PRIM, mut_slice_t, slice_t)

overloadable slice_t slice(mut_slice_t, size_t, size_t);
overloadable slice_t slice(slice_t, size_t, size_t);
slice_t referEntire(mut_slice_t);
slice_t fromString(char const *);
mut_slice_t mutFromString(char const *);
void freeMutSlice(mut_slice_t const *);
mut_slice_t concat(slice_t, slice_t);