Skip to main content Link Search Menu Expand Document (external link)

Builder overview

This module provides a type-safe, immutable builder pattern implementation using Effect.

Added in v0.1.0


Table of contents


combinators

compose

Signature

export declare const compose: <A>(...transforms: Array<Transform<A>>) => Transform<A>

Example

import { Schema, Effect, pipe } from "effect"
import { define, compose } from "effect-builder/Builder"

const UserSchema = Schema.Struct({
  name: Schema.String,
  age: Schema.Number,
  roles: Schema.Array(Schema.String).annotations({ default: ["user"] })
})

const User = define(UserSchema)

const result = Effect.gen(function* () {
  return yield* pipe(
    compose(
      User.name("John"),
      User.age(25),
      User.roles.modify((roles) => [...roles, "admin"])
    ),
    User.build
  )
}).pipe(Effect.runSync)

console.log("Created user:", result)
// {
//   name: "John",
//   age: 25,
//   roles: ["admin"]
// }

Added in v0.1.0

constructors

createBuilderLenses

Creates a builder lens for each field in the schema

Signature

export declare const createBuilderLenses: <A>(schema: Schema.Struct<any>) => BuilderLens<A>

Added in v0.3.0

define

Creates a builder for constructing objects with runtime validation.

Signature

export declare const define: <F extends Schema.Struct.Fields>(
  schema: Schema.Struct<F>,
  defaults?: Partial<SchemaType<F>>
) => Builder<F, Schema.Schema.Context<F[keyof F]>>

Example

import { Schema, Effect, pipe } from "effect"
import { define, compose } from "effect-builder/Builder"

const UserSchema = Schema.Struct({
  name: Schema.String
})

const User = define(UserSchema)

const result = Effect.gen(function* () {
  return yield* pipe(compose(User.name("John")), User.build)
}).pipe(Effect.runSync)

console.log("Created user:", result)
// {

Added in v0.1.0

errors

BuilderError (class)

Signature

export declare class BuilderError

Added in v0.3.0

ValidationError (class)

Signature

export declare class ValidationError

Added in v0.3.0

models

Builder (type alias)

Signature

export type Builder<F extends Schema.Struct.Fields, R> = BuilderOp<F, R> &
  Omit<BuilderLens<SchemaType<F>>, keyof BuilderOp<F, R>>

Added in v0.3.0

BuilderLens (type alias)

Signature

export type BuilderLens<A> = {
  readonly [K in keyof A]: {
    (value: A[K]): Transform<A>
    readonly get: (s: Partial<A>) => A[K] | undefined
    readonly modify: (f: (value: A[K]) => A[K]) => Transform<A>
  }
}

Added in v0.3.0

BuilderOp (interface)

Signature

export interface BuilderOp<F extends Schema.Struct.Fields, R> {
  readonly schema: Schema.Struct<F>
  readonly Default: Partial<SchemaType<F>>
  readonly field: <K extends keyof SchemaType<F>>(key: K) => Lens<SchemaType<F>, SchemaType<F>[K]>
  readonly when: (
    predicate: (a: Partial<SchemaType<F>>) => boolean,
    ifTrue: Transform<SchemaType<F>>,
    ifFalse?: Transform<SchemaType<F>>
  ) => Transform<SchemaType<F>>
  readonly build: (transform: Transform<SchemaType<F>>) => Effect.Effect<SchemaType<F>, ValidationError, R>
}

Added in v0.3.0

Lens (interface)

Signature

export interface Lens<S, A> {
  readonly get: (s: Partial<S>) => A | undefined
  readonly set: <V extends A>(value: V) => Transform<S>
  readonly modify: (f: (value: A) => A) => Transform<S>
}

Added in v0.3.0

Transform (type alias)

Signature

export type Transform<A> = (a: Partial<A>) => Partial<A>

Added in v0.3.0