Skip to content
This repository has been archived by the owner on May 3, 2021. It is now read-only.

Commit

Permalink
feat: at optic tests complete
Browse files Browse the repository at this point in the history
  • Loading branch information
baetheus committed Apr 13, 2021
1 parent 65783d3 commit e28d65b
Show file tree
Hide file tree
Showing 4 changed files with 45 additions and 11 deletions.
4 changes: 2 additions & 2 deletions optics/at.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,8 @@ export const atRecord = <A = never>(): At<
at: (key) => ({
get: (r) => O.fromNullable(r[key]),
set: O.fold(
(a) => R.insertAt(key, a),
() => R.deleteAt(key),
(a) => R.insertAt(key, a),
),
}),
});
Expand All @@ -37,12 +37,12 @@ export const atMap = <A = never>(): At<
at: (key) => ({
get: (m) => O.fromNullable(m.get(key)),
set: O.fold(
(a) => (m) => m.set(key, a),
() =>
(m) => {
m.delete(key);
return m;
},
(a) => (m) => m.set(key, a),
),
}),
});
10 changes: 5 additions & 5 deletions optics/optional.ts
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,8 @@ export const asTraversal = <S, A>(sa: Optional<S, A>): Traversal<S, A> => ({
pipe(
sa.getOption(s),
O.fold(
(a) => pipe(fata(a), F.map((a: A) => sa.set(a)(s))),
() => F.of(s),
(a) => pipe(fata(a), F.map((a: A) => sa.set(a)(s))),
),
),
});
Expand Down Expand Up @@ -73,7 +73,7 @@ export const compose = <J, K>(jk: Optional<J, K>) =>
pipe(
ij.getOption(s),
O.map(jk.set(b)),
O.fold(ij.set, () => identity),
O.fold(() => identity, ij.set),
)(s),
});

Expand All @@ -91,7 +91,7 @@ export const composeLens = <A, B>(ab: Lens<A, B>) =>
pipe(
sa.getOption(s),
O.map(ab.set(b)),
O.fold(flow(sa.set, apply(s)), constant(s)),
O.fold(constant(s), flow(sa.set, apply(s))),
),
});

Expand All @@ -109,8 +109,8 @@ export const composeTraversal = <A, B>(ab: Traversal<A, B>) =>
pipe(
sa.getOption(s),
O.fold(
flow(ab.traverse(T)(fata), T.map(flow(sa.set, apply(s)))),
constant(T.of(s)),
flow(ab.traverse(T)(fata), T.map(flow(sa.set, apply(s)))),
),
),
});
Expand Down Expand Up @@ -138,7 +138,7 @@ export const modify = <A>(faa: (a: A) => A) =>
pipe(
sa.getOption(s),
O.map(faa),
O.fold(flow(sa.set, apply(s)), constant(s)),
O.fold(constant(s), flow(sa.set, apply(s))),
);

export const traverse = <URI extends URIS>(T: TC.Traversable<URI>) => {
Expand Down
8 changes: 4 additions & 4 deletions optics/prism.ts
Original file line number Diff line number Diff line change
Expand Up @@ -62,8 +62,8 @@ export const asTraversal = <S, A>(sa: Prism<S, A>): Traversal<S, A> => ({
pipe(
sa.getOption(s),
O.fold(
flow(fata, T.map(flow(getSet(sa), apply(s)))),
() => T.of(s),
flow(fata, T.map(flow(getSet(sa), apply(s)))),
),
),
});
Expand Down Expand Up @@ -103,7 +103,7 @@ export const composeLens = <A, B>(ab: Lens<A, B>) =>
(s) =>
pipe(
sa.getOption(s),
O.fold(flow(ab.set(b), sa.reverseGet), () => s),
O.fold(() => s, flow(ab.set(b), sa.reverseGet)),
),
});

Expand All @@ -114,7 +114,7 @@ export const composeOptional = <A, B>(ab: Optional<A, B>) =>
(s) =>
pipe(
sa.getOption(s),
O.fold(flow(ab.set(b), sa.reverseGet), () => s),
O.fold(() => s, flow(ab.set(b), sa.reverseGet)),
),
});

Expand All @@ -126,8 +126,8 @@ export const composeTraversal = <A, B>(ab: Traversal<A, B>) =>
pipe(
sa.getOption(s),
O.fold(
flow(ab.traverse(A)(fata), A.map(sa.reverseGet)),
constant(A.of(s)),
flow(ab.traverse(A)(fata), A.map(sa.reverseGet)),
),
),
});
Expand Down
34 changes: 34 additions & 0 deletions testing/optics/at.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import { assertEquals } from "https://deno.land/std/testing/asserts.ts";

import * as A from "../../optics/at.ts";
import * as O from "../../option.ts";

Deno.test("At atRecord", () => {
const at = A.atRecord<number>();
const { get, set } = at.at("one");

assertEquals(get({}), O.none);
assertEquals(get({ two: 1 }), O.none);
assertEquals(get({ one: 1 }), O.some(1));

assertEquals(set(O.none)({}), {});
assertEquals(set(O.none)({ one: 1 }), {});
assertEquals(set(O.some(1))({}), { one: 1 });
assertEquals(set(O.some(1))({ one: 2 }), { one: 1 });
assertEquals(set(O.some(1))({ one: 1 }), { one: 1 });
});

Deno.test("At atMap", () => {
const at = A.atMap<number>();
const { get, set } = at.at("one");

assertEquals(get(new Map()), O.none);
assertEquals(get(new Map([["one", 1]])), O.some(1));
assertEquals(get(new Map([["two", 1]])), O.none);

assertEquals(set(O.none)(new Map()), new Map());
assertEquals(set(O.none)(new Map([["one", 1]])), new Map());
assertEquals(set(O.some(1))(new Map()), new Map([["one", 1]]));
assertEquals(set(O.some(1))(new Map([["one", 2]])), new Map([["one", 1]]));
assertEquals(set(O.some(1))(new Map([["one", 1]])), new Map([["one", 1]]));
});

0 comments on commit e28d65b

Please sign in to comment.