Effect by Example: Reading Files

Tags:

platform

Note: All examples on this page require the FileSystem service to be provided, you can do this by providing the implementation of FileSystem for your platform at any point in your program

import { Effect } from "effect";
import { FileSystem } from "@effect/platform";
import { NodeFileSystem } from "@effect/platform-node";
declare const main: Effect.Effect<void, never, FileSystem.FileSystem>;
const runnable = main.pipe(Effect.provide(NodeFileSystem.layer));

Reading a File as Bytes

import { Effect, Console } from "effect";
import { FileSystem } from "@effect/platform";
const main = Effect.gen(function* () {
const fs = yield* FileSystem.FileSystem;
yield* fs.writeFileString("file.txt", "Hello, world!");
const bytes = yield* fs.readFile("file.txt");
console.log(bytes);
});
3 collapsed lines
import { NodeContext } from "@effect/platform-node";
await main.pipe(Effect.provide(NodeContext.layer), Effect.runPromise);
<Buffer 48 65 6c 6c 6f 2c 20 77 6f 72 6c 64 21>

Reading a File as Text

import { Effect, Console } from "effect";
import { FileSystem } from "@effect/platform";
const main = Effect.gen(function* () {
const fs = yield* FileSystem.FileSystem;
yield* fs.writeFileString("file.txt", "Hello, world!");
const string = yield* fs.readFileString("file.txt");
console.log(string);
});
3 collapsed lines
import { NodeContext } from "@effect/platform-node";
await main.pipe(Effect.provide(NodeContext.layer), Effect.runPromise);
Hello, world!

Reading a File Incrementally

import { Effect } from "effect";
import { FileSystem } from "@effect/platform";
const main = Effect.gen(function* () {
const fs = yield* FileSystem.FileSystem;
yield* fs.writeFileString("file.txt", "Hello, world!");
// opening a file is a scoped operation
const file = yield* fs.open("file.txt");
// seek 4 bytes from the start
yield* file.seek(4, "start");
// read into a buffer
const buffer = new Uint8Array(5);
const sizeRead = yield* file.read(buffer);
console.log(buffer);
// seek 2 bytes from the current position
yield* file.seek(2, "current");
// read and allocate a buffer for result
const buffer2 = yield* file.readAlloc(5);
console.log(buffer2);
// ensures the file is closed after the effect ends
}).pipe(Effect.scoped);
3 collapsed lines
import { NodeContext } from "@effect/platform-node";
await main.pipe(Effect.provide(NodeContext.layer), Effect.runPromise);
Uint8Array(5) [ 111, 44, 32, 119, 111 ]
{
_id: "Option",
_tag: "Some",
value: {
type: "Buffer",
data: [ 100, 33 ],
},
}