import type * as P from "@principia/prelude";
import * as HKT from "@principia/prelude/HKT";
import { identity } from "../Function";
import { Functor, map_ } from "./functor";
import type { URI, V } from "./model";
import { unit } from "./unit";
/*
* -------------------------------------------
* Monad Identity
* -------------------------------------------
*/
export const chain_ = (ma: A, f: (a: A) => B): B => f(ma);
export const chain = (f: (a: A) => B) => (ma: A): B => f(ma);
export const tap_ = (ma: A, f: (a: A) => B): A => chain_(ma, (a) => map_(f(a), () => a));
export const tap = (f: (a: A) => B) => (ma: A): A => tap_(ma, f);
export const flatten = (mma: A): A => chain_(mma, identity);
export const Monad: P.Monad<[URI], V> = HKT.instance({
...Functor,
unit,
flatten
});