# bakana extension for takane formats ![Unit tests](https://github.com/kanaverse/bakana-takane/actions/workflows/run-tests.yaml/badge.svg) ![Documentation](https://github.com/kanaverse/bakana-takane/actions/workflows/build-docs.yaml/badge.svg) ![NPM](https://img.shields.io/npm/v/bakana-takane) Implements [**bakana**-compatible](https://github.com/kanaverse/bakana) readers for [**takane**](https://github.com/ArtifactDB/takane)-formatted datasets and results. Developers can define subclasses to load data from their own local/remote sources, e.g., [**gypsum**](https://github.com/ArtifactDB/gypsum-worker). To demonstrate, we'll show how to read a dataset from the local filesystem with Node.js. First, install the package from **npm**: ```shell npm install bakana-takane ``` Given a string containing some kind of "path" with Unix file separators, developers should define a method to get/list the contents of the file or directory. ```js import * as fs from "fs"; export function getFile(path) { const contents = fs.readFileSync(path, null); return new Uint8Array(contents); } export function listFiles(path) { return fs.readdirSync(path); } ``` We define a subclass of the `AbstractDataset`: ```js import * as bt from "bakana-takane" class LocalDataset extends bt.AbstractDataset { constructor(path) { super(path, getFile, listFiles); } // Extra methods required by bakana; omitting the // serialize/unserialize methods for simplicity. static format() { return "local-takane"; } abbreviate() { return { "path": path }; } }; ``` Instances of our `LocalDataset` can now be used in **bakana**: ```js import * as bakana from "bakana"; const ds = new LocalDataset("/path/to/dataset"); let state = await bakana.createAnalysis(); let params = bakana.analysisDefaults(); await bakana.runAnalysis(state, { dataset: ds }, params); ``` Subclasses of the `AbstractResult` are even easier to define: ```js class LocalResult extends bt.AbstractResult { constructor(path) { super(path, getFile, listFiles); } }; ``` Check out the [reference documentation](https://kanaverse.org/bakana-takane) for more information.