aboutsummaryrefslogtreecommitdiff
path: root/stdlib/effect.ts
diff options
context:
space:
mode:
authorAkshay Nair <phenax5@gmail.com>2023-01-15 00:13:04 +0530
committerAkshay Nair <phenax5@gmail.com>2023-01-15 00:13:04 +0530
commitd5c3af89ab8076bcf4107859c1ba6b47a7815142 (patch)
tree1da469a7007fe2cfced0647ae62c1cd003a3fa0d /stdlib/effect.ts
parente75a5a15912b8f297fe9c9747f574486d6c4e334 (diff)
downloadts-types-lang-d5c3af89ab8076bcf4107859c1ba6b47a7815142.tar.gz
ts-types-lang-d5c3af89ab8076bcf4107859c1ba6b47a7815142.zip
chore: some more documentation
Diffstat (limited to '')
-rw-r--r--stdlib/effect.ts89
1 files changed, 89 insertions, 0 deletions
diff --git a/stdlib/effect.ts b/stdlib/effect.ts
index 4a994c4..7eb557c 100644
--- a/stdlib/effect.ts
+++ b/stdlib/effect.ts
@@ -57,16 +57,105 @@ export type Func<Inp = unknown, Out = unknown> =
| Kind1<Inp, Out>
| (<_T extends Inp>() => Out)
+/**
+ * Monadic bind an effect to a function (Equivalent to haskell's >>= operator)
+ *
+ * @typeParam _Eff - Effect to evaluate first
+ * @typeParam _Fn - Function to call with the result of _Eff
+ *
+ * @example
+ * ```ts
+ * type main = Bind<
+ * ReadFile<"./file.txt">,
+ * <contents extends string>() => Print<contents>
+ * >
+ * ```
+ */
export interface Bind<_Eff extends Effect, _Fn extends Func> extends Effect {}
+/**
+ * Bind result of evaluating an effect to a label (Equivalent to haskell's <- syntax)
+ *
+ * Note: labels are scoped to outermost Do, Bind, Try, etc scopes
+ *
+ * @typeParam _Name - The name of label
+ * @typeParam _Eff - Effect to evaluate
+ *
+ * @example
+ * ```ts
+ * type main = Do<[
+ * // contents <- readFile "./file.txt"
+ * BindTo<"contents", ReadFile<"./file.txt">>,
+ * Bind<Label<"contents">, <c extends string>() => Print<c>>
+ * ]>
+ * ```
+ */
export interface BindTo<_Name extends string, _Eff extends Effect>
extends Effect {}
+
+/**
+ * Access a label defined with {@link BindTo}
+ *
+ * @typeParam _Name - The name of label
+ *
+ * @example
+ * ```ts
+ * type main = Do<[
+ * BindTo<"contents", ReadFile<"./file.txt">>,
+ * Bind<Label<"contents">, <c extends string>() => Print<c>>
+ * ]>
+ * ```
+ */
export interface Label<_Name extends string> extends Effect {}
+/**
+ * Evaluate a sequence of effects in series and get the list of results
+ *
+ * @typeParam _Effs - List of effects
+ *
+ * @example
+ * ```ts
+ * type main = Bind<
+ * Seq<[ Pure<1>, ReadFile<"./foobar.txt"> ]>,
+ * <t extends [number, string]>() => Print<t>
+ * >
+ * ```
+ */
export interface Seq<_Effs extends Effect[]> extends Effect {}
+/**
+ * Evaluate a sequence of effects in series and get the result of the last effect (Equivalent to haskell's do syntax)
+ *
+ * @typeParam _Effs - List of effects
+ *
+ * @example
+ * ```ts
+ * type main = Bind<
+ * Do<[ Pure<1>, ReadFile<"./foobar.txt"> ]>,
+ * <t extends string>() => Print<t>
+ * >
+ * ```
+ */
export interface Do<_Effs extends Effect[]> extends Effect {}
+/**
+ * Wrap a value inside an effect (Equivalent to haskell's pure function)
+ *
+ * @typeParam V - Value
+ *
+ * @example
+ * ```ts
+ * type main = Bind<Pure<1>, <t extends number>() => Print<t>>
+ * ```
+ */
export interface Pure<V> extends Effect<V> {}
+/**
+ * Noop effect that does nothing (returns undefined)
+ *
+ * @example
+ * ```ts
+ * type main = Bind<Noop, <t extends undefined>() => Print<t>>
+ * ```
+ */
export interface Noop extends Effect {}