Skip to content

Commit ba53480

Browse files
committed
refactor to avoid explicit any type
1 parent 7a1f189 commit ba53480

File tree

7 files changed

+22
-20
lines changed

7 files changed

+22
-20
lines changed

src/fantasy/typeclasses/applicative.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ export namespace Applicative {
1111

1212
export function lift2<F extends ApplicativeInstances, A, B, C>(fabc: (a: A, b: B) => C): (fa: $<F, A>, fb: $<F, B>) => $<F, C> {
1313
return function(fa: $<F, A>, fb: $<F, B>): $<F, C> {
14-
let instance: any = Applicative[kind(fa) as F]
14+
let instance = Applicative[kind<F>(fa)] as Applicative<F>
1515
return ap2<F, A, B, C>(instance.pure(fabc), fa, fb)
1616
}
1717
}

src/fantasy/typeclasses/apply.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,17 +13,17 @@ export namespace Apply {
1313
}
1414

1515
export function ap<F extends ApplyInstances, A, B>(fab: $<F, (a: A) => B>, fa: $<F, A>): $<F, B> {
16-
let instance = (<any>Functor)[kind(fab)]
17-
let faba: $<F, [(a: A) => B, A]> = instance.product(fab, fa)
18-
return instance.map((aba: [(a: A) => B, A]) => aba[0](aba[1]), faba) as $<F, B>
16+
let instance = Apply[kind<F>(fab)] as Apply<F>
17+
let faba = instance.product<(a: A) => B, A>(fab, fa)
18+
return instance.map((aba: [(a: A) => B, A]) => aba[0](aba[1]), faba)
1919
}
2020

2121
export function ap2<F extends ApplyInstances, A, B, C>(fabc: $<F, (a: A, b: B) => C>, fa: $<F, A>, fb: $<F, B>): $<F, C> {
22-
let instance: any = Apply[kind(fabc) as F]
23-
return instance.ap(
22+
let instance = Apply[kind<F>(fabc)] as Apply<F>
23+
return ap<F, [A, B], C>(
2424
instance.map(
2525
(f: (a: A, b: B) => C) => (([a, b]: [A, B]) => f(a, b))
2626
, fabc)
27-
, instance.product(fa, fb)
28-
) as $<F, C>
27+
, instance.product<A, B>(fa, fb)
28+
)
2929
}

src/fantasy/typeclasses/cartesian.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@ export interface Cartesian<F extends HKT> {
55
product<A, B>(fa: $<F, A>, fb: $<F, B>): $<F, [A, B]>
66
}
77

8-
export namespace Cartesian {
8+
export namespace Cartesian {
99
const __name = "Cartesian"
1010
}
1111

1212
export function product<F extends CartesianInstances, A, B>(fa: $<F, A>, fb: $<F, B>): $<F, [A, B]> {
13-
let instance = (<any>Cartesian)[kind(fa)]
14-
return instance.product(fa, fb) as $<F, [A, B]>
13+
let instance = Cartesian[kind<F>(fa)] as Cartesian<F>
14+
return instance.product<A, B>(fa, fb)
1515
}

src/fantasy/typeclasses/flatmap.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@ export interface FlatMap<F extends HKT> extends Apply<F> {
55
flatMap<A, B>(f: (a: A) => $<F, B>, fb: $<F, A>): $<F, B>
66
}
77
export type FlatMapInstances = keyof typeof FlatMap
8-
export namespace FlatMap {
8+
export namespace FlatMap {
99
const __name = "FlatMap"
1010
}
1111

1212
export function flatMap<F extends FlatMapInstances, A, B>(f: (a: A) => $<F, B>, fa: $<F, A>): $<F, B> {
13-
return (<any>FlatMap)[kind(fa)].flatMap(f, fa) as $<F, B>
13+
return (FlatMap[kind<F>(fa)] as FlatMap<F>).flatMap<A, B>(f, fa)
1414
}

src/fantasy/typeclasses/functor.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,6 @@ export namespace Functor {
1212
}
1313

1414
export function map<F extends FunctorInstances, A, B>(f: (a: A) => B, fa: $<F, A>): $<F, B> {
15-
let instance = (<any>Functor)[kind(fa)]
16-
return instance.map(f, fa) as $<F, B>
15+
let instance = Functor[kind<F>(fa)] as Functor<F>
16+
return instance.map(f, fa)
1717
}

src/fantasy/typeclasses/index.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ export interface _<A> {
55
export type HKT = keyof _<any>
66

77
export type $<F extends HKT, A> = _<A>[F]
8+
89
import 'reflect-metadata'
910

1011
export function datatype(name: string) {
@@ -13,7 +14,7 @@ export function datatype(name: string) {
1314
}
1415
}
1516

16-
export function kind(target: any) {
17+
export function datatypeOf(target: any): string {
1718
if (isPrimitive(target)) {
1819
return target.constructor.name
1920
}
@@ -22,7 +23,10 @@ export function kind(target: any) {
2223
if (tag) return tag
2324
throw new Error(`target ${target.constructor} is not a datatype, please decorate it with @datatype!`)
2425
}
26+
}
2527

28+
export function kind<F extends HKT>(target: $<F, any>): F {
29+
return datatypeOf(target) as F
2630
}
2731

2832
datatype('Array')(Array)

src/fantasy/typeclasses/semigroup.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
export type instanceKey = keyof S
22
export type S = typeof Semigroup
3-
import { datatype, kind } from '.'
3+
import { datatype, datatypeOf } from '.'
44
export type SemigroupInstance = keyof typeof Semigroup
55
export type SemigroupInstanceType = typeof Semigroup[SemigroupInstance]['_T']
66
export interface Semigroup<A> {
@@ -38,8 +38,6 @@ export class StringSemigroup implements Semigroup<string> {
3838
export class ArraySemigroup<A> implements Semigroup<Array<A>> {
3939
_T: Array<A>
4040
concat(a: Array<A>, b: Array<A>): Array<A> {
41-
console.log(a, b, '----------------------')
42-
4341
return a.concat(b)
4442
}
4543
}
@@ -53,6 +51,6 @@ export namespace Semigroup {
5351
}
5452

5553
export function concat<A extends SemigroupInstanceType>(a: A, b: A): A {
56-
let instance = (<any>Semigroup)[kind(a)]
54+
let instance = (<any>Semigroup)[datatypeOf(a)]
5755
return instance.concat(a, b)
5856
}

0 commit comments

Comments
 (0)