Use when Effect core patterns including Effect<A, E, R> type, succeed, fail, sync, promise, and Effect.gen for composing effects. Use for basic Effect operations.
View on GitHubSelect agents to install to:
npx add-skill https://github.com/TheBushidoCollective/han/blob/main/plugins/frameworks/effect/skills/effect-core-patterns/SKILL.md -a claude-code --skill effect-core-patternsInstallation paths:
.claude/skills/effect-core-patterns/# Effect Core Patterns
Master the core Effect patterns for building type-safe, composable applications
with Effect. This skill covers the Effect type, constructors, and composition
patterns using Effect.gen.
## The Effect Type
The Effect type has three type parameters:
```typescript
Effect<Success, Error, Requirements>
```
- **Success (A)**: The type of value that an effect can succeed with
- **Error (E)**: The expected errors that can occur (use `never` for no errors)
- **Requirements (R)**: The contextual dependencies required (use `never` for no dependencies)
```typescript
import { Effect } from "effect"
// Effect that succeeds with number, never fails, no requirements
const simpleEffect: Effect.Effect<number, never, never> = Effect.succeed(42)
// Effect that can fail with string error
const failableEffect: Effect.Effect<number, string, never> =
Effect.fail("Something went wrong")
// Effect that requires a UserService
interface UserService {
getUser: (id: string) => Effect.Effect<User, DbError, never>
}
const effectWithDeps: Effect.Effect<User, DbError, UserService> =
Effect.gen(function* () {
const userService = yield* Effect.service(UserService)
const user = yield* userService.getUser("123")
return user
})
```
## Creating Effects
### Effect.succeed - Always Succeeds
Use when you have a pure value and need an Effect:
```typescript
import { Effect } from "effect"
const result = Effect.succeed(42)
// Effect<number, never, never>
const user = Effect.succeed({ id: "1", name: "Alice" })
// Effect<User, never, never>
// Void effect (produces no useful value)
const voidEffect = Effect.succeed(undefined)
// Effect<void, never, never>
```
### Effect.fail - Expected Failure
Use for recoverable, expected errors:
```typescript
import { Effect } from "effect"
interface ValidationError {
_tag: "ValidationError"
message: string
}
const validateAge = (age: number): Effect.Effect<number, ValidationError, never> => {
if (age < 0) {