Skip to content

Instantly share code, notes, and snippets.

View SandroMaglione's full-sized avatar
💻
Open Source

Sandro Maglione SandroMaglione

💻
Open Source
View GitHub Profile
@SandroMaglione
SandroMaglione / File.ts
Created May 1, 2024 20:56
File upload validation service created using `effect` only
import { Brand, Context, Data, Effect, Layer } from "effect";
type FileMetadata = Readonly<{ type: string; size: number }>;
export type ValidFile = FileMetadata & Brand.Brand<"ValidFile">;
const ValidFile = Brand.nominal<ValidFile>();
class FileTooLargeError extends Data.TaggedError("FileTooLargeError")<
Readonly<{ size: number }>
> {}
@SandroMaglione
SandroMaglione / machine.ts
Created January 3, 2024 18:39
Setup code for an empty state machine in XState v5
import { setup } from "xstate";
const machine = setup({
types: {
context: {} as {},
events: {} as { readonly type: "event"; readonly params: {} },
},
actions: {},
}).createMachine({
id: "machine",
@SandroMaglione
SandroMaglione / parse_zod.ts
Created November 22, 2023 18:21
Helper functions to gradually migrate from `zod` to `@effect/schema`
import { Data, Either } from "effect";
import type { z } from "zod";
export class ZodParseError<In> extends Data.TaggedError("ZodParseError")<{
error: z.ZodError<In>;
}> {}
export const parseZod =
<ReqOut, ReqIn>(schema: z.Schema<ReqOut, z.ZodTypeDef, ReqIn>) =>
<T>(data: T): Either.Either<ZodParseError<ReqIn>, ReqOut> => {
@SandroMaglione
SandroMaglione / fpdart_io_either_extension.dart
Created November 28, 2022 05:55
Run side effects in a chain of IOEither using fpdart
extension IOExtension<L, R> on IOEither<L, R> {
IOEither<L, R> runSideEffect({
final void Function(L l)? onLeft,
final void Function(R r)? onRight,
}) =>
chainFirst(
(r) => IOEither<L, void>.fromIO(
IO(() => onRight?.call(r)),
),
)
@SandroMaglione
SandroMaglione / supabase_fp_ts.ts
Last active June 10, 2021 18:57
Utility to simplify the API of supabase-js and make the response fully functional using TaskEither and Option from fp-ts.
// fp_ts
import * as O from 'fp-ts/Option';
import * as TE from 'fp-ts/TaskEither';
import { pipe } from 'fp-ts/lib/function';
import { head } from 'fp-ts/lib/Array';
// Supabase
import { PostgrestFilterBuilder } from '@supabase/postgrest-js';
import { SupabaseQueryBuilder } from '@supabase/supabase-js/dist/main/lib/SupabaseQueryBuilder';
import { SupabaseClient } from '@supabase/supabase-js';
@SandroMaglione
SandroMaglione / base64_mixin.dart
Created December 3, 2020 13:58
Convert from and to base64 a String in dart
import 'dart:convert';
/// Manage conversion to and from base 64
mixin Base64Mixin {
/// Converts a [dynamic] data from plain [String] to base64
String toBase64(dynamic data) => base64.encode(utf8.encode(jsonEncode(data)));
/// Converts a [dynamic] data from base64 to plain [String]
String fromBase64(dynamic data) => utf8.decode(base64.decode(data as String));
}