import { Data, pipe } from "effect"
type RemoteData<Success, Failure> = Data.TaggedEnum<{
Loading: {}
Success: { data: Success }
Failure: { reason: Failure }
}>
interface RemoteDataDefinition extends Data.TaggedEnum.WithGenerics<2> {
readonly taggedEnum: RemoteData<this["A"], this["B"]>
}
const { Loading, $match } = Data.taggedEnum<RemoteDataDefinition>()
const state: RemoteData<string, string> = Loading()
const result = pipe(state, $match({
Loading: () => "Loading",
// error.reason and value.data are unknown type
Failure: (error) => "Failure",
Success: (value) => "Success"
}))
import { Data, pipe } from "effect"
type RemoteData<Success, Failure> = Data.TaggedEnum<{
Loading: {}
Success: { data: Success }
Failure: { reason: Failure }
}>
interface RemoteDataDefinition extends Data.TaggedEnum.WithGenerics<2> {
readonly taggedEnum: RemoteData<this["A"], this["B"]>
}
const { Loading, $match } = Data.taggedEnum<RemoteDataDefinition>()
const state: RemoteData<string, string> = Loading()
const result = pipe(state, $match({
Loading: () => "Loading",
// error.reason and value.data are unknown type
Failure: (error) => "Failure",
Success: (value) => "Success"
}))