Press n or j to go to the next uncovered block, b, p or k for the previous block.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | 1x 1x 400x 400x 400x 1x 1x 400x 400x 400x 400x 1x 1x | import {HKT, flow} from 'effect' /** * A typeclass for lossless bidirectional conversion between two encodings. * @category typeclass */ export interface Isomorphism<A, B> { readonly to: (from: A) => B readonly from: (to: B) => A } /** * Type lambda for the `Isomorphism` typeclass. * @category type lambda */ export interface IsomorphismTypeLambda extends HKT.TypeLambda { readonly type: Isomorphism<this['Target'], this['Out1']> } /** * Flip the encode/decode direction: encode becomes decode and decode becomes * encode. * @category typeclass */ export const reverse = <A, B>({ to, from, }: Isomorphism<A, B>): Isomorphism<B, A> => ({from: to, to: from}) /** * Compose two isomorphisms of `A⇒B` and `B⇒C` into an isomorphism of `a⇒C`. * @category typeclass */ export const compose = <A, B>(F: Isomorphism<A, B>) => <C>(G: Isomorphism<B, C>): Isomorphism<A, C> => ({ to: flow(F.to, G.to), from: flow(G.from, F.from), }) /** * Run the `to` transform of the isomorphism. * @category typeclass */ export const encode = <A, B>(iso: Isomorphism<A, B>): ((a: A) => B) => iso.to, /** * Run the `from` transform of the isomorphism. * @category type lambda */ decode = <A, B>(iso: Isomorphism<A, B>): ((a: B) => A) => iso.from |