diff options
| author | Nic Gaffney <gaffney_nic@protonmail.com> | 2025-10-20 01:59:56 -0500 |
|---|---|---|
| committer | Nic Gaffney <gaffney_nic@protonmail.com> | 2025-10-20 02:02:15 -0500 |
| commit | 78d191cbf396d2ea32d920282934aa44f8ade4be (patch) | |
| tree | 825d57cf191a761fa4ef40d543b525d87d9f6141 /src/lib.zig | |
| parent | 7093b84120dc899a08508b7da2472c5e3edcc008 (diff) | |
| download | funcz-78d191cbf396d2ea32d920282934aa44f8ade4be.tar.gz | |
inital commit
Diffstat (limited to 'src/lib.zig')
| -rw-r--r-- | src/lib.zig | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/src/lib.zig b/src/lib.zig new file mode 100644 index 0000000..8e99ad3 --- /dev/null +++ b/src/lib.zig @@ -0,0 +1,73 @@ +const std = @import("std"); + +/// Compose two single argument functions +pub fn compose( + comptime outerFunc: anytype, + comptime innerFunc: anytype +) blk:{ + const outerFuncType = @TypeOf(outerFunc); + const outerFuncTypeInfo = @typeInfo(outerFuncType); + if(outerFuncTypeInfo != .@"fn") + @compileError("Expected function, found " ++ @typeName(outerFuncType)); + const innerFuncType = @TypeOf(innerFunc); + const innerFuncTypeInfo = @typeInfo(innerFuncType); + if(innerFuncTypeInfo != .@"fn") + @compileError("Expected function, found " ++ @typeName(innerFuncType)); + const out = @typeInfo(@TypeOf(outerFunc)).@"fn".return_type.?; + const in = @typeInfo(@TypeOf(innerFunc)).@"fn".params[0].type.?; + break :blk fn(in) out; +} { + const out = @typeInfo(@TypeOf(outerFunc)).@"fn".return_type.?; + const in = @typeInfo(@TypeOf(innerFunc)).@"fn".params[0].type.?; + return struct { + fn func(input: in) out { + return outerFunc(innerFunc(input)); + } + }.func; +} + +pub fn mapAlloc( + allocator: std.mem.Allocator, + func: anytype, + items: anytype, +) error{OutOfMemory}!blk:{ + const itemsType = @TypeOf(items); + const itemsTypeInfo = @typeInfo(itemsType); + const funcType = @TypeOf(func); + const funcTypeInfo = @typeInfo(funcType); + if(funcTypeInfo != .@"fn") + @compileError("Expected function, found " ++ @typeName(funcType)); + if(itemsTypeInfo != .array and itemsTypeInfo != .pointer) { + @compileError("Expected array or slice, found " ++ @typeName(itemsType)); + } + + break :blk []funcTypeInfo.@"fn".return_type.?; +} { + const funcType = @TypeOf(func); + const funcTypeInfo = @typeInfo(funcType); + var result = try allocator.alloc(funcTypeInfo.@"fn".return_type.?, items.len); + for(items, 0..) |item, i| + result[i] = func(item); + return result; +} + +pub fn map( + func: anytype, + items: anytype, + buffer: anytype, +) void { + const funcType = @TypeOf(func); + const bufferType = @TypeOf(buffer); + const itemsType = @TypeOf(items); + const funcTypeInfo = @typeInfo(funcType); + const bufferTypeInfo = @typeInfo(bufferType); + const itemsTypeInfo = @typeInfo(itemsType); + if(funcTypeInfo != .@"fn") + @compileError("Expected function, found " ++ @typeName(funcType)); + if(itemsTypeInfo != .array and itemsTypeInfo != .pointer) + @compileError("Expected array, found " ++ @typeName(itemsType)); + if(bufferTypeInfo != .array and bufferTypeInfo != .pointer) + @compileError("Expected array, found " ++ @typeName(bufferType)); + for (items, 0..) |item, i| + buffer.*[i] = func(item); +} |
