Last active
August 29, 2015 14:05
-
-
Save mkawalec/a0fe63c9294028469639 to your computer and use it in GitHub Desktop.
Function wrapper
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
# Tak się używa macza, tylko kurczę, jak pozbyć się tego pierwszego parametru, bo on nam niepotrzebny:P | |
match bla, | |
obj({a:1}) fun(supafn) obj({bla: 2}) -> code_1 | |
type(String) -> code_2 | |
# To wrapper funkcji. Jak się łączy kilka, to zakładając, że wyrażenie nazywa się a, uruchamia się przez a([arg1, arg2,...]) | |
w = (testelem) -> | |
(rightParam) -> | |
(toEval) -> | |
param = toEval.shift() | |
if typeof testelem is 'function' | |
if testelem(param) | |
rightParam.call(@, toEval) | |
else | |
throw 'broken' | |
else if Object.prototype.toString.call(testelem) is '[object Object]' | |
if _.difference(_.keys(testelem), _.keys(param)).length is 0 | |
thisExtenstion = _.reduce testelem, ((acc, value, key) -> | |
acc[value] = param[key] | |
return acc | |
), {} | |
rightParam.call(_.assign(@, thisExtension), toEval) | |
else | |
throw 'broken' | |
else | |
throw 'unsupported arg' |
trzeba jeszcze przekazywać w prawo zmienne do ustawienia, ale to będzie drugi parametr do rightParam
Albo lepiej, żeby było ogólnie -> w prawo propaguje się this, rozszerzony (_.assign) o this pochodzący z tego wywołania
i wywołuje się thisem ustawionym na outer this
Czyli, pozostałe wrappery:
- dokończenie fun
- obj
- list
- regex
- param = tylko binduje parametr
pierwszy parametr mógłby być thisem z jakim chcemy maczować, jeśli nie jesteśmy w stanie się go pozbyć:P
aaaa, przecież możemy mieć jeden wrapper i nazwać go jakoś fajnie, na przykład 'w'.
myślałem, że zrobisz coś w stylu:
fun = match
pred -> a
co zostanie skompilowane do
var fun;
fun = match(pred(function() {
return a;
}));
i dajmy na to, ze pred
jest stworzony przez construktor Pred
, wiec wtedy mozesz stwierdzic, czy wywolujesz predykat na docelowej funkcji, czy nie. Wtedy można spokojnie czainować predykaty.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Zamiast 'broken', trzeba zwracać coś unikalnego, pewnie instancję jakiejś error klasy, albo jakiś exception może?