Skip to content

Instantly share code, notes, and snippets.

View nadako's full-sized avatar

Dan Korostelev nadako

View GitHub Profile
@nadako
nadako / CheckMutating.hx
Created July 15, 2014 18:32
Static check for mutating method calls
import haxe.macro.Context;
import haxe.macro.Type;
using haxe.macro.Tools;
class CheckMutating {
static var metaToRemove:Array<MetaAccess>;
static function use() {
Context.onGenerate(function(types) {
@nadako
nadako / EnumComparisonMacro.hx
Created August 20, 2014 13:05
Order based comparison operators for non-integer @:enum abstracts
import haxe.macro.Context;
import haxe.macro.Expr;
class EnumComparisonMacro {
static function build() {
// get ComplexType for the abstract we're building
var t = switch(Context.getLocalType()) {
case TInst(_.get() => {kind: KAbstractImpl(_.get() => ab)}, _): TPath({pack: ab.pack, name: ab.name});
case _: throw false;
}
@nadako
nadako / Either.hx
Created August 29, 2014 15:11
Either type builder using new Rest feature
@:dce
@:genericBuild(EitherMacro.build())
class Either<Rest> {}
/**
Хеширование строки
**/
public static function hash(key:String):Int {
// простейший алгоритм djb2
inline function cca(s:String, i:Int):Int {
// наиболее быстрое и небезопасное получение кода символа
#if js
return (untyped s).charCodeAt(i);
@nadako
nadako / Main.hx
Created November 18, 2014 13:27
Type params syntax sugar.
class Main {
static function main() {
var event:MapChangeEvent<Map<String,Int>>;
$type(event.key); // String
$type(event.value); // Int
}
}
@:remove
@:autoBuild(SkipSerializeMacro.build())
interface ISkipSerialize {}
@nadako
nadako / DI.hx
Created April 16, 2015 19:04
Simple macro-based dependency injection system based on factory functions
import haxe.macro.Expr;
import haxe.Constraints.Function;
#if macro
import haxe.macro.Context;
import haxe.macro.Type;
using haxe.macro.Tools;
#end
class DI {
@nadako
nadako / Data.hx
Last active August 29, 2015 14:24
import js.html.ArrayBuffer;
import js.html.DataView;
import DataTypes;
@:dce
@:build(DataMacro.build())
abstract Data(DataView) {
var byte:Uint8;
var int:Int32;
var float:Float32;
@nadako
nadako / LocaleMacro.hx
Created July 21, 2015 14:42
Type-safe localization.
import haxe.macro.Context;
import haxe.macro.Expr;
import haxe.macro.Type;
using haxe.macro.Tools;
class LocaleMacro {
static function build():Array<Field> {
var fields = Context.getBuildFields();
var newFields:Array<Field> = [];
for (field in fields) {
@:build(MyMacro.build())
abstract MapItem(Array<Dynamic>) {
var itemId:Int;
var defId:String;
}
class Main {
static function main() {
var item = new MapItem();
item.itemId = 10;