Skip to content

Instantly share code, notes, and snippets.

@guillaumewuip
Last active July 1, 2020 20:02
Show Gist options
  • Save guillaumewuip/8f34df47bfe7bd0cdfa3a6ae6ee8d5c8 to your computer and use it in GitHub Desktop.
Save guillaumewuip/8f34df47bfe7bd0cdfa3a6ae6ee8d5c8 to your computer and use it in GitHub Desktop.
// message.ts
import { createOpaqueAPI } from ‘@iadvize-oss/opaque-type’;
import { createFoldObject } from ‘@iadvize-oss/foldable-helpers’;
type $Text = {
text: string;
}
type $Image = {
url: string;
description: string;
}
const TextOpaqueAPI = createOpaqueAPI<
'Text',
$Text,
>('Text’);
const ImageOpaqueAPI = createOpaqueAPI<
‘Image’,
$Image,
>('Image’);
// opaque types
export type Text = ReturnType<typeof TextOpaqueAPI.toOpaque>;
export type Image = ReturnType<typeof ImageOpaqueAPI.toOpaque>;
// union of opaque types
export type Message = Text | Image;
// constructors
export function createText(text: string): Text {
return TextOpaqueAPI.toOpaque({ text });
}
export function createImage({ url, description }): Image {
return ImageOpaqueAPI.toOpaque({ url, description });
}
// queries
export function text(message: Text): string {
const $message = TextOpaqueAPI.fromOpaque(message);
return $message.text;
}
export function url(message: Image): string {
const $message = ImageOpaqueAPI.fromOpaque(message);
return $message.url;
}
export function description(message: Image): string {
const $message = ImageOpaqueAPI.fromOpaque(message);
return $message.description;
}
export function isText(message: Message): message is Text {
return TextOpaqueAPIisOpaque(message);
}
export function isImage(message: Message): message is Image {
return ImageOpaqueAPIisOpaque(message);
}
// transformations
export function addSignature(signature: string) {
return (message: Text): Text => {
const $message = TextOpaqueAPI.fromOpaque(message);
const newText = `${$message.text} - ${signature}`;
return TextOpaqueAPI.toOpaque({ text: newText });
};
}
export function withBitlyUrl(message: Image): Image {
const $message = ImageOpaqueAPI.fromOpaque(message);
const newUrl = convertToBitly($message.url);
return ImageOpaqueAPI.toOpaque({ ...$message, url: newUrl });
}
// fold function from @iadvize-oss/foldable-helpers
const fold = createFoldObject({
Text: isText,
Image: isImage
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment