gluon 0.18.2

A static, type inferred programming language for application embedding
Documentation
let { Eff, ? } = import! std.effect
let { State, send_state, make_call } = import! std.effect.st
let prim @ { StringBuf } = import! std.effect.st.string.prim

let new : forall s . Eff [| st : State s | r |] (StringBuf s) =
    send_state (make_call prim.new)

let len buf : StringBuf s -> Eff [| st : State s | r |] Int =
    send_state (make_call (\_ -> prim.len buf))

let push_str buf str : StringBuf s -> String -> Eff [| st : State s | r |] () =
    send_state (make_call (\_ -> prim.push_str buf str))

let slice buf start end : StringBuf s -> Int -> Int -> Eff [| st : State s | r |] String =
    send_state (make_call (\_ -> prim.slice buf start end))

/// ```
/// let { assert_eq, ? } = import! std.test
/// let st = import! std.effect.st
/// let string_buf = import! std.effect.st.string
/// let { (*>) } = import! std.applicative
/// let { Eff, run_pure, ? } = import! std.effect
///
/// let action =
///     do buf = string_buf.new
///     seq string_buf.push_str buf "field:"
///     seq string_buf.push_str buf " "
///     seq string_buf.push_str buf "123"
///     string_buf.read buf
/// assert_eq (run_pure (st.run_state action)) "field: 123"
/// ```
let read buf : StringBuf s -> Eff [| st : State s | r |] String =
    do l = len buf
    slice buf 0 l

{
    StringBuf,

    new,
    len,
    push_str,
    slice,
    read,
}