E.L.I.T.E.'s Workshop

4

E.L.I.T.E.'s Workshop

TypeWrapper



TypeWrapper je biblioteka koja služi kao imitacija statičkih tipova u PHP-u. Obzirom da je PHP dinamički tipiziran jezik, promenljiva može u bilo kom trenutku da promeni tip podatka što ponekad (pogotovo u većim projektima) ume da bude vrlo problematično. PHP7 je uveo strict types no to važi samo kod pisanja funkcija, ali ne i kod definisanja novih promenljivih. Ovo je naravno imitacija jer su "tipovi" zapravo samo objekti koji u sebi imaju mehanizme koji im omogućavaju da sadrže samo određene tipove čime se postiže veća kontrola (ali se u isto vreme i uvodi dodatna apstrakcija što je u nekim slučajevima nepoželjno).

Primer koda napisanog sa TypeWrapper bibliotekom:

use TypeWrapper\Foundation\Types\TInt as TInt;

# Kreira TInt objekat sa vrednošću 17.
$age = new TInt(17);

function notMinor(TInt $age) {
    return $age() >= 18;
}

# Vraća false.
notMinor($age);

# Menja vrednost TInt objekta u 21.
$age(21);

# Vraća true.
notMinor($age);

Takođe je moguće i definisanje nizova, kreiranje TType objekata od PHP promenljivih, a planiram i da implementiram pattern matching sličan onom u funkcionalnim jezicima:

TTuple::match($array, [
  [ [$Int, $Int] => $doThis ],
  [ [$Int, $_  ] => $doThat ]
]);

Ne verujem da će ikome biti od neke posebne koristi, ali mi je vrlo drag projekat Smile

https://bitbucket.org/zeyn99/typewrapper/src



SensorUI

Bejah danas nešto obuzet razmišljanjima i pade mi na pamet ideja za JS biblioteku. Praktično u pitanju je biblioteka koja omogućava kreiranje sopstvenih event listener-a. Princip je jednostavan; postoji senzor (element koji sadrži klasičan event listener, tipa onclick, onhover i sl) i primaoci signala koji su navedeni unutar senzora i koji 'osluškuju' i u zavisnosti od primljene poruke preko objekta signala (koji sadrži u sebi poruku kao i kopiju objekta pošiljaoca odnosno senzora koji je signal poslao) odrađuju određenu akciju. To u praksi izgleda ovako:

var sensor1 = new Sensor(document.getElementById('button1')).setName('sensor1');
var textField1 = document.getElementById('text1');
var textField2 = document.getElementById('text2');

sensor1.setReceivers([textField1, textField2])
.addListenerToReceivers('change text', function (sender, receiver) {
    receiver.element.innerText = 'Ovaj element je izmenio senzor \'' + sender.name + '\'.';
});

sensor1.onClick().send('change text').toAll();





Ovde se ne vidi signal, ali je definisan u izvornom kodu biblioteke. Planiram da dodam još interesantnih stvari poput imenovanja primaoca tako da bude moguće nešto ovako:

sensor1.onClick().send('change text').to('textField1', 'textField5');

osluškivanja senzora između sebe, preusmeravanje signala i sl.

Source: https://bitbucket.org/zeyn99/sensorui



Malo sam izmenio strukturu biblioteke ali u suštini to je to; sada svaki primalac ima svoje ime takođe i moguće je slušaoce prikačiti na sve ili samo na određene primaoce, ali i slati signale na isti način Smile

Kod za gornji primer:

var textField = new Sensor(document.getElementById('textField')).setName('textField');

textField.addReceivers({
    'text': document.getElementById('text'),
    'textCount': document.getElementById('textCount')
})

.addListener('change text', function (sender, receiver) {
    receiver.element.innerText = sender.element.value;
}, { to: ['text'] });

.addListener('count chars', function (sender, receiver) {
    receiver.element.innerText = sender.element.value.length;
}, { to: ['textCount'] });

textField.sendOn('change', 'change text', { to: ['text'] });
textField.sendOn('change', 'count chars', { to: ['textCount'] });


Još samo da vidim kako ću da sredim da biblioteka može da se koristi sa različitim module bundler-ima i može da ide na npm.

Ko je trenutno na forumu
 

Ukupno su 759 korisnika na forumu :: 13 registrovanih, 3 sakrivenih i 743 gosta   ::   [ Administrator ] [ Supermoderator ] [ Moderator ] :: Detaljnije

Najviše korisnika na forumu ikad bilo je 3466 - dana 01 Jun 2021 17:07

Korisnici koji su trenutno na forumu:
Korisnici trenutno na forumu: Bojan5150, brundo65, dragoljub11987, ILGromovnik, Kenanjoz, Krvava Devetka, Kubovac, mikki jons, radionica1, saputnik plavetnila, sasa76, Stoilkovic, wizzardone