message: add loopUnit
diff: import { pipe } from "../Function"
  -import { chain_, succeed } from "./core"
  +import { chain_, succeed, unit } from "./core"
  import type { Effect } from "./effect"
  import { map } from "./map"
  @@ -34,3 +34,27 @@ export function loop<Z>(initial: Z) {
  return succeed([])
  }
  }
  +
  +/**
  + * Loops with the specified effectual function purely for its effects. The
  + * moral equivalent of:
  + *
  + * ```
  + * var s = initial
  + *
  + * while (cont(s)) {
  + * body(s)
  + * s = inc(s)
  + * }
  + * ```
  + */
  +export function loopUnit<Z>(initial: Z) {
  + return (cont: (z: Z) => boolean, inc: (z: Z) => Z) => <S, R, E>(
  + body: (z: Z) => Effect<S, R, E, any>
  + ): Effect<S, R, E, void> => {
  + if (cont(initial)) {
  + return chain_(body(initial), () => loop(inc(initial))(cont, inc)(body))
  + }
  + return unit
  + }
  +}
  