I hereby claim:
- I am castarco on github.
- I am castarco (https://keybase.io/castarco) on keybase.
- I have a public key whose fingerprint is 9D10 B5B4 1B15 934F C867 8397 40BB CA62 EF4B 86CC
To claim this, I am signing this object:
[init] | |
defaultBranch = main | |
[commit] | |
gpgsign = true | |
template = ${HOME}/.gitmessage | |
[push] | |
gpgSign = if-asked | |
[log] | |
showSignature = true |
// This first file contains the first iteration of this pattern. It's already | |
// nice, but not enough for full-fledged IoC libraries. | |
// There's a second file in this same gist that goes one step further, although, | |
// for now, it still needs some extra polish. | |
// ----------------------------------------------------------------------------- | |
// First: the two main interfaces. | |
// They are the core of the pattern. | |
// ----------------------------------------------------------------------------- | |
export interface WritableRegistry { |
// We use symbols to eliminate any chance for problems with serialization | |
const __BaseType: unique symbol = new Symbol('__BaseType') | |
const __Brand: unique symbol = new Symbol('__Brand') | |
// We mark the "brand/flavor" fields as readonly to avoid anyone doing weird stuff with them | |
// We add a "__BaseType" field to make possible "complex" type manipulations | |
// We accept "symbol" tags as a mechanism to avoid "types forgery" to bypass the type checker, | |
// although I foresee that most of the times it won't be used. | |
export type Branded<BaseType, Tag extends string | symbol> = BaseType & { | |
readonly [__BaseType]: BaseType |
export type ChainNominal<BaseType, Tag extends string> = BaseType extends { | |
__type: infer Tag0 | |
__baseType: infer BaseType0 | |
} | |
? Tag0 extends [...infer NestedTags] | |
? BaseType0 & { __type: [Tag, ...NestedTags]; __baseType: BaseType0 } | |
: never | |
: BaseType & { | |
__type: [Tag] // Using an array allow us to use multiple type tags :3 | |
__baseType: BaseType // Only here to ease type inference |
I hereby claim:
To claim this, I am signing this object:
/** | |
* This approach has many limitations: | |
* - it does not accept variable names with numbers or other symbols (relatively easy to fix) | |
* - it does not accept arbitrary expressions (quite difficult to fix) | |
*/ | |
function deferredTemplateLiteral(template: string, env: { [key: string]: string | undefined }): string { | |
const varsMatcher = /\${([a-zA-Z_]+)}/ | |
const globalVarsmatcher = /\${[a-zA-Z_]+}/g | |
const varMatches: string[] = template.match(globalVarsmatcher) ?? [] |
<?php | |
/** | |
* The MIT License (MIT) | |
* | |
* Copyright (c) 2015 Andrés Correa Casablanca <castarco@litipk.com> | |
* | |
* Permission is hereby granted, free of charge, to any person obtaining a copy of | |
* this software and associated documentation files (the "Software"), to deal in | |
* the Software without restriction, including without limitation the rights to |
<?php | |
declare(strict_types=1); | |
function array_zip(array ...$arrays): array | |
{ | |
// Applied suggestion from reddit | |
// https://www.reddit.com/r/PHP/comments/76czco/php_equivalent_of_pythons_zip_function/doe5j86/ | |
return \array_map(null, ...$arrays); | |
} |
<?php | |
declare(strict_types=1); | |
/** | |
* Requires the DS extension (see https://github.com/php-ds/extension). | |
* This script is a benchmark for simple RW operations on Ds\Vector (without affecting its length) | |
*/ | |
/** | |
* RESULTS (the times are not divided by the number of iterations, only numbers in the same row can be compared): |