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,
}