import {
DateTimes,
GetRandomValues,
makeUuid7,
Uuid7,
Uuid7State,
} from "@typed/id";
import { Console, Effect, pipe, Schema } from "effect";
const defaultUuid = (schema: Schema.Schema.All) => {
return pipe(
schema,
Schema.propertySignature,
Schema.withConstructorDefault(() =>
makeUuid7.pipe(
Effect.provide(Uuid7State.Default),
Effect.provide([GetRandomValues.CryptoRandom, DateTimes.Default]),
Effect.runSync
)
)
);
};
// USAGE
export const UserId = Uuid7.pipe(Schema.brand("UserId"));
export type UserId = typeof UserId.Type;
export class User extends Schema.Class<User>("User")({
id: UserId.pipe(defaultUuid),
name: Schema.NonEmptyTrimmedString,
}) {}
const user = User.make({ name: "John Doe" });
Console.log(user).pipe(Effect.runSync);
// Output:
// User { id: '0197c78d-8e0f-775a-a795-98938df30727', name: 'John Doe' }
// But:
// user.id is any
import {
DateTimes,
GetRandomValues,
makeUuid7,
Uuid7,
Uuid7State,
} from "@typed/id";
import { Console, Effect, pipe, Schema } from "effect";
const defaultUuid = (schema: Schema.Schema.All) => {
return pipe(
schema,
Schema.propertySignature,
Schema.withConstructorDefault(() =>
makeUuid7.pipe(
Effect.provide(Uuid7State.Default),
Effect.provide([GetRandomValues.CryptoRandom, DateTimes.Default]),
Effect.runSync
)
)
);
};
// USAGE
export const UserId = Uuid7.pipe(Schema.brand("UserId"));
export type UserId = typeof UserId.Type;
export class User extends Schema.Class<User>("User")({
id: UserId.pipe(defaultUuid),
name: Schema.NonEmptyTrimmedString,
}) {}
const user = User.make({ name: "John Doe" });
Console.log(user).pipe(Effect.runSync);
// Output:
// User { id: '0197c78d-8e0f-775a-a795-98938df30727', name: 'John Doe' }
// But:
// user.id is any