Skip to content

Instantly share code, notes, and snippets.

View AlexAegis's full-sized avatar
🦔
ʕ•ᴥ•ʔ

Sandor AlexAegis

🦔
ʕ•ᴥ•ʔ
View GitHub Profile
@AlexAegis
AlexAegis / photoshop_cartesian.js
Created April 17, 2019 13:50
Photoshop layer permutator
/**
* Photoshop only accepts ExtendScript which is compliant to ECMA-262 (version 3)
*
* This script, when executed in Photoshop exports all the possible combinations of layers in the first group of the active activeDocument
* For example:
* If the top group has 2 subgroups, each having 2 layers
* this script will export 4 pictures with the following layers being visible:
* [0, 0]
* [0, 1]
* [1, 0]
@AlexAegis
AlexAegis / tween-map.operator.ts
Last active April 28, 2019 04:37
Tween mapper for RxJS
import { Observable, OperatorFunction, BehaviorSubject } from 'rxjs';
import { mergeMap, filter } from 'rxjs/operators';
import { Tween, Easing } from '@tweenjs/tween.js';
export interface Tweenable<T> {
from: T;
to: T;
}
@AlexAegis
AlexAegis / accumulate.function.ts
Last active April 28, 2019 21:52
Object property accumulator for flattening deltas
/**
* Object state accumulator that ignores undefineds
*
* Example usage:
*
* ```typescript
* const accumulator = {};
*
* const stateA = { a: 'value' };
* const stateB = { a: undefined, b: 'bval' };
@AlexAegis
AlexAegis / with-teardown.operator.ts
Last active November 28, 2019 14:13
Activate and Teardown side-effect OperatorFunction for RxJS
import { of, OperatorFunction, Observable, EMPTY, merge, NEVER } from 'rxjs';
import { switchMap, finalize, tap } from 'rxjs/operators';
/**
* Sideffect that can tear down the previous object when a new one enters. Can handle undefined and still
* do the teardown on the last element
*
* Neither function will ever recieve undefined values.
*
* Example:
@AlexAegis
AlexAegis / infinite-progress.operator.ts
Last active November 28, 2019 14:15
RxJS Loading and progress tracking pipeline operator with an arbitrary number of sources that can be extended anytime!
import { of, Subject, Observable, OperatorFunction } from 'rxjs';
import { delay, tap, map, flatMap, mergeScan, reduce, finalize } from 'rxjs/operators';
/**
* Over-time loader. This pipeline can be attached to a non-ending observable, though, you can't rely
* on the `finalize()` operator for checking if the loading is done or not.
* The observables you supply into it should be completeable.
*
* This can be extremely useful when you want that each of the 'loader' start as soon as possible, but still keep
* track of the progress. At the last `tap()` you can always see when one loader finishes that how many observables
@AlexAegis
AlexAegis / base.directive.ts
Last active August 21, 2020 02:05
Angular subscription handler, unsubscribes when the component is destroyed
import { OnDestroy } from '@angular/core';
import { Subscription } from 'rxjs';
/**
* Adds a subscription object and a default OnDestroy hook to the child component
*
* If ngOnDestroy is is overriden in the child component don't forget to call
* ```typescript
* super.ngOnDestroy();
* ```
@AlexAegis
AlexAegis / http-effect.function.ts
Last active August 21, 2020 09:22
Http effect creator for NgRX
import { Actions, ofType } from '@ngrx/effects';
import { ActionCreator } from '@ngrx/store';
import { TypedAction } from '@ngrx/store/src/models';
import { Observable, of } from 'rxjs';
import { catchError, map, switchMap } from 'rxjs/operators';
/**
* It will automatically strip the actions `type` field away before forwarding it
* to the httpCall. This way no accidental type fields are sent anywhere.
*
@AlexAegis
AlexAegis / binary-tree.ts
Created September 23, 2020 13:14
Inverting a binary tree in one line
export class Node<T> {
public left?: Node<T>;
public right?: Node<T>;
public constructor(public value: T) {}
public invert(): Node<T> {
return ([this.left, this.right] = [this.right?.invert(), this.left?.invert()]) && this;
}
public toString(): string {
@AlexAegis
AlexAegis / base-model.type.ts
Created October 23, 2020 14:50
Convert relative models to foreign keys
export interface Model {
id: number;
}
export interface FooModel extends Model {
name: string;
}
export interface BarModel extends Model {
name: string;
@AlexAegis
AlexAegis / setup-voicemeeter-routing.md
Last active November 27, 2020 23:39
Streaming audio through VoiceMeeter

Streaming audio through VoiceMeeter Banana

  1. Install VoiceMeeter Banana
  2. Keep the windows default sound output as is. Select where you want to listen as always (Like a headphone)
  3. Select the VoiceMeeter Output as windows default input. (Your microphones and another virtual input will all be routed to this)
  4. Start VoiceMeeter Banana
  5. Select your mic(s) in your hardware outputs, and route them only to channel B (Disable A, this will make sure that you wont hear your own mic)
  6. Let the Virtual Input routed to both A and B channels. (This will let everything that is routed into this virtual channel to be heard by both you and the virtual microphone)
  7. Select as the A1 output the MME variant of your main output (Like your headset. MME lets that sink recieve sound from multiple sources. WDM would take exclusive access which means that you either hear only the sounds you want to share or everything else).
  8. Select any sources in the Windows Sound Mixer