Last active
July 1, 2020 20:02
-
-
Save guillaumewuip/8f34df47bfe7bd0cdfa3a6ae6ee8d5c8 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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