åã®ã·ãªãŒãºã®èŠçŽïŒæãåçŽãªã¢ããªã±ãŒã·ã§ã³ã¯ãéåžžã«è€éãªã¬ãã«ã«éããŸãããããã«å¯ŸåŠããããã«ãæœè±¡åãã¢ãã ããå°å ¥ãããŸããã ã ãã¹ãŠã®çè«ãšåçããããŸãã ããããã®ç·Žç¿ãã³ãŒãã®äŸãã³ã³ãœãŒã«ã®ãã³ãããããŸãã
TypeScriptã䜿çšããçç±
ã¢ãžã¥ãŒã«ã®æåã®å®è£ ã¯çŽç²ãªJavaScriptã§ããããæè¿TypeScriptã§æžãçŽãããŸããã TypeScriptã¯ã»ãšãã©åãJavaScriptã§ãããã¯ã©ã¹ãåæšè«ãããã³éåžžã®ã©ã ãããããŸãã ãã以äžã®å€æŽã¯ãããŸããããã®çµæãéåžžã®JavaScriptã³ãŒããšéåžžã«ããçµ±åãããŸãã JavaScriptããTypeScriptã¢ãžã¥ãŒã«ã«çŽæ¥ã¢ã¯ã»ã¹ã§ãããã®éãå¯èœã§ãã ããã§ãªãéããéçåä»ããæäŸããå©ç¹ã倱ããªãããã«ãJSããããããç°å¢å®£èšããèšè¿°ããããšããå§ãããŸãã ãããŠã圌女ã¯ä»¥äžã®ããŒãã¹ãäžããŸãïŒ
* IDEã®ãã³ãã¯ããã¹ãŠã®ã¯ã©ã¹ã®ãã¹ãŠã®ã¡ãœãããšããããã£ã«é¢ããããã¥ã¡ã³ããèŠããŠããå¿ èŠããããã°ã©ãã解æŸããŸãã
*ãšã³ãã£ãã£ã®ãã¹ãŠã®äœ¿çšå Žæãæ€çŽ¢ããŸã-ãªãã¡ã¯ã¿ãªã³ã°ã«äžå¯æ¬ ã§ãã
*ç·šé/ã¢ã»ã³ããªæ®µéã§ã®ã¢ããªã±ãŒã·ã§ã³ã®ç°ãªãéšåéã®åã®äžäžèŽã®èå¥ã
æ®å¿µãªãããæ¬ ç¹ããããŸãã
*æã«ã¯ãã¿ã³ããªã³ãšèžããªãããã³ã³ãã€ã©ãŒã«ããªãã®èšã£ãŠããããšã説æããªããã°ãªããŸããã
TypeScriptã«ã¯2ã€ã®éžæè¢ããããŸãã
JSDocã¯ãã³ã¡ã³ãå ã®åçã³ãŒããéçã«èšè¿°ããããã®éåžžã«éè¡šçŸçãªåœ¢åŒã§ãã å€ãã®å ŽåãJSDocã³ã¡ã³ãã®éïŒå£é ã§ã®èª¬æãèæ ®ã«å ¥ããªãïŒã¯ãå®éã«åœ¹ç«ã€ã³ãŒã以äžã®ãã®ã§ãã é©åãªäºäŸïŒ
/** * @callback onTitleChange_handler * @param {string} next * @param {string} prev */ /** * @param {onTitleChange_handler} handler */ function onTitleChange( handler ){ // ... } onTitleChange( /** * @type {onTitleChange_handler} */ function( next, prev ){ // ... } )
Dart-å¥ã®èšèªãåžãããJavaScriptã§æŸéãããããã«èšèšãããŠããã å®å šã«ç°ãªãã€ãã£ãªã ã䜿çšããŸããããã¯ãJavaScriptã³ãŒããšçµ±åããå Žåã«å€ãã®å¶éããããã¡ã¢ãªæ¶è²»éãéåžžã«å€ããããçµã¿èŸŒã¿ã®ãã©ãŠã¶ãŒããŒã«ã䜿çšããŠãããã°ããå Žåã®åé¡ããããDartããçæãããã³ãŒãã¯éåžžã«èšå€§ãªéººã§ãã äžèšã®äŸã§ã¯ã次ã®ããã«ãªããŸãã
typedef void onTitleChange_handler( String next , String prev ); onTitleChange( onTitleChange_handler handler ){ // ... } void main() { onTitleChange( ( next, prev ) => { // ... }); }
ãã§ã«åªããŠããŸãããååä»ãã®ã€ã³ã¿ãŒãã§ã€ã¹/ã¿ã€ããå€ãããããšãå¿ èŠã§ãã ããã¯äž»æ Œã¿ã€ãã³ã°ã®äž»ãªæ¬ ç¹ã§ãã TypeScriptã¯æ§é ã䜿çšããŸãïŒ
function onTitleChange( handler : ( next : string , prev : string ) => void ){ // ... } onTitleChange( ( next, prev ) => { // ... });
ãã ããå¿ èŠã«å¿ããŠãã€ã³ã¿ãŒãã§ã€ã¹ã«ååãä»ããããšãã§ããŸãã
interface onTitleChange_handler { ( next : string , prev : string ) : void } function onTitleChange( handler : onTitleChange_handler ){ // ... } onTitleChange( ( next, prev ) => { // ... });
TypeScriptã«åãæ¿ãããšãã®åèšïŒ
+ã³ãŒããµã€ãºã®åæž
+éçºç°å¢ãšã®çµ±åã®æ¹å
+å ¥åæã«è¿œå ã®æ€èšŒã衚瀺ãããŸã
-å®è¡åã«JavaScriptã§ç¿»èš³ããå¿ èŠæ§ãè¿œå
ç¥è©±ãšäŒèª¬ã®FRP
ãªã¢ã¯ãã£ãã©ã€ãã©ãªã¯ãäž»ã«2ã€ã®ã¿ã€ãã«åé¡ã§ããŸãã
1.å®éã«ã¯FunctionalRPãã¢ããªã±ãŒã·ã§ã³å šäœãå€ãã®çŽç²ãªæ©èœãšããŠèšè¿°ãããŠããŸãã
2. FRPãšæ··åãããããšãå€ãProceduralRPã ãããã§ã¯ãã¢ããªã±ãŒã·ã§ã³ã¯ã€ãã³ãã®ã¹ããªãŒã ïŒã¹ããªãŒã ïŒã®åœ¢åŒã§å¿ é ã§èšè¿°ãããŠããŸãã
2çªç®ã®å Žåãã¢ããªã±ãŒã·ã§ã³ã¯ãã©ãŒã ã®äžé£ã®ããã·ãŒãžã£ãšããŠèšè¿°ãããŸããç°ãªãå ŽæããããŒã¿ãååŸãããããã«ç¹å®ã®å€æãé 次é©çšããä»ã®å Žæã«æžã蟌ã¿ãŸãã
this.message = Bacon.combine( [ this.mouseTarget, this.mouseCoords ] , function( target, coords ) { return target + ' ' + coords } ) .map( trimSpaces ) .map( htmlEncode ) .map( htmlParse ) .onValue( function( messaage ){ document.getElementById( 'log' ).appendChild( message ) } )
ããŒã«ã®å°ãªã圢åŒã§æžãããåããã®ãšæ¯èŒããŠãã ããïŒ
this.onChange( [ 'mouseCoords', 'mouseTarget' ] , function( ){ var message = this.mouseTarget + ' ' + this.mouseCoords message = trimSpaces( message ) message = htmlEncode( message ) message = htmlParse( message ) this.message = message document.getElementById( 'log' ).appendChild( message ) this.fireChange( 'message' ) }
PRPã¢ãŒããã¯ãã£ã«æºæ ããæåãªPRPã©ã€ãã©ãªïŒ Rx ã Bacon ïŒã«ã¯ãããªãè€éãªAPIããããŸãã å°é£ã¯ãã¹ããªãŒã ã«ããããçš®é¡ã®æŒç®åãå®è£ ããèšå€§ãªæ°ã®ã¡ãœãããšãæãåçŽãªæäœã®èšè¿°æ¹æ³ã®äž¡æ¹ã«ãããŸãã ããšãã°ãæ£ããæ¡ä»¶åå²ã¯æ¬¡ã®ããã«ãªããŸãã
var message = config.flatMapLatest( function( config ) { if( config ) { return mouseCoords.map( function( coords ) { return 'Mouse coords is ' + coords } } else { return mouseTarget.map( function( target ) { return 'Mouse target is ' + target } } } )
ãããŠãããã«ééã£ããã®ããããŸãïŒ
var message = Bacon.combineWith( function( config, coords, target ) { if( config ) { return 'Mouse coords is ' + coords } else { return 'Mouse target is ' + target } }, config, mouseCoords, mouseTarget )
2çªç®ã®ãªãã·ã§ã³ã¯ã¯ããã«ã·ã³ãã«ã§çŽæçã§ãããã¡ãã»ãŒãžå€ã®èšç®ã¯3ã€ã®ã¹ããªãŒã ãã¹ãŠã®å€æŽã§çºçããŸããããã®å€ã¯åžžã«3ã€ã®ã¹ããªãŒã ã®ãã¡2ã€ã ãã«äŸåããããšã¯æããã§ãã æåã®ããŒãžã§ã³ã§ã¯ãã®ãããªåé¡ã¯ãããŸããããããã¯ããžãã¯ã®å€§å¹ ãªè€éåã«ãã£ãŠéæãããŸãã
ä»åŸãæ¯èŒã®ããã«ã¢ãã ã®æ£ããã³ãŒãã瀺ããŸãã
var message = $jin.atom.prop( { pull : function( ) { if( config.get() ) { return 'Mouse coords is ' + coords.get() } else { return 'Mouse target is ' + target.get() } } } )
ç°¡åã«èšãã°ãPRPã§ã¯ãããŒã¿ãœãŒã¹ãæ¯èŒçå°ãªãããã®æ§æãå®è³ªçã«å€æŽãããŠããªãäŸåé¢ä¿ãèšè¿°ããã®ã䟿å©ã§ãããFRPã§ã¯ãéã«ãè¡šçŸåã倱ãããšãªããœãŒã¹ã®ã»ãããä»»æãã€åçã«ããããšãã§ããŸãã ããŒã¿ã³ã³ã·ã¥ãŒããŒã§ã¯ãéã®ããšãåœãŠã¯ãŸããŸã.PRPã§ã¯ãåãç¶æ ãå€ãã®ç°ãªãã¹ããªãŒã ã§å€åããå¯èœæ§ããããFRPã§ã¯ã1ã€ã®ç¶æ ã«1ã€ã®é¢æ°ã責任ãè² ã£ãŠãããå€ãã©ã®ããã«åœ¢æãããäœã«çŽæ¥äŸåãããã¯åžžã«æ確ã§ã
å¥ã®äžè¬çãªèª€è§£ã¯ãåå¿æ§ã¯ã¢ãã«ãšè¡šçŸã®æ¥åéšã§ã®ã¿å¿ èŠã§ãããšãããã®ã§ãã ãã ããå®éã«ã¯ãåå¿æ§ã¯ããåºæ¬çãªæŠå¿µã§ãã ç¶æ éã§äžå€åŒãç¶æããå¿ èŠããããŸãã ãã£ãã·ã¥ã¯ç¶æ ã§ãã æ°žç¶ã¹ãã¬ãŒãžã¯ãã¹ãŠç¶æ ã§ãã èŠèŠåã¯ãã¹ãŠç¶æ ã§ãã ç¶æ ã¯ã©ãã«ã§ããããåãã¢ããªã±ãŒã·ã§ã³å±€å ã§ãã£ãŠãç¬ç«ããŠããŸããã
ããããã£
ã¢ãã ã®å®è£ ã«çæããåã«ãå€ïŒRValueïŒãšã³ã³ããïŒLValueïŒã®2ã€ã®æŠå¿µãåºå¥ãã䟡å€ããããŸãã
æãæåãªã³ã³ããã¯å€æ°ã§ãã å€æ°ã¯3ã€ã®ã€ã³ã¿ãŒãã§ã€ã¹ã®ã¿ããµããŒãããŸãã
var count // count = 2 // return count //
ãã1ã€ã®ãããã»ã©ããç¥ãããŠããªãã³ã³ããã¯ãªããžã§ã¯ããã£ãŒã«ãã§ãã ãã¹ãŠã®å¯å€ã€ã³ã¿ãŒãã§ãŒã¹ããµããŒãããŸãïŒ
obj.count = 2 // ( ) return obj.count //
ãããããããã«å ããŠããã£ãŒã«ãã¯ããã«ããã€ãããµããŒãããŸãïŒ
delete obj.field // 'field' in obj //
ã芧ã®ããã«ãå€ãã®ã€ã³ã¿ãŒãã§ãŒã¹ã¯ãªããèŠãç®ã¯å®å šã«ç°ãªã£ãŠããŸãã ééããªãã¢ãã ãå«ãŸããããè€éãªã³ã³ãããå®è£ ããã«ã¯ãããã«å€ãã®ã€ã³ã¿ãŒãã§ã€ã¹ãå¿ èŠãªã®ã§ããã®ãããªã³ã³ãããã¯ã©ã¹ãšããŠå®è£ ããŸãã å€æ°ã®å®è£ ã¯æ¬¡ã®ããã«ãªããŸãã
var count = new $jin.prop.vary({}) // count.set( 2 ) // count.get() //

äžæ¹ã§ã¯ãç³é¹žã®åæéããå€æŽããŸãããã³ã³ããïŒå€æ°countïŒã¯ãå€èªäœãä¿åããå¥ã®ã³ã³ããïŒã¯ã©ã¹$ jin.prop.varyã®ã€ã³ã¹ã¿ã³ã¹ïŒãä¿åããŸãã äžæ¹ãã³ã³ãããªããžã§ã¯ãã¯ãéåžžã®å€æ°ãšã¯ç°ãªããæ¢ã«ãæåã®ã¯ã©ã¹ãã®ãšã³ãã£ãã£ã§ããã€ãŸããé¢æ°ã«åŒæ°ãšããŠæž¡ãããçµæãšããŠè¿ãããšãã§ããŸãã ããã¯æã 䟿å©ã§ãããã»ãšãã©ã®å ŽåãäžèŠã§ãã ã€ã³ã¿ãŒãã§ã€ã¹ã®å®è£ ãæšæºã®ãã®ãšç°ãªãå Žåã¯ãã¯ããã«äŸ¿å©ã§ãã
var title = new $jin.prop.proxy({ put : function( next ) { document.title = next }, pull : function( ) { return document.title }, }) title.set( 'Hello!' ) // title.get() //

$ jin.prop.proxyã¯ã¹ããŒãã¬ã¹ã³ã³ããã®å®è£ ã§ããããéåžžã®å€æ°ããŸãã¯ããªããžã§ã¯ãã®ããããã£ãã®ããããã§ãã
var doc = { get title( ) { return new $jin.prop.proxy({ put : function( next ) { document.title = next }, pull : function( ) { return document.title }, }) } } doc.title.set( 'Hello' ) // doc.title.get() //

ãã®å Žåãgetã€ã³ã¿ãŒãã§ãŒã¹ã¯pullãã³ãã©ãŒãåŒã³åºããsetã³ãŒã«ãputããŸãã ãã®ãããªçœ®æã¯ãçç±ã®ããã«è¡ãããŸããã§ãã-äžè¬çãªå Žåããããã¯å®éã«å®å šã«ç°ãªãã€ã³ã¿ãŒãã§ãŒã¹ã§ãã éããç解ããã«ã¯ãç¶æ ãå ¥åããŠæãããªæ¡ä»¶ãè¿œå ããã ãã§ãã
1ïŒå€ããŸã èšå®ãããŠããªãå Žåã«ã®ã¿ãã«åŒã³åºããååŸããããã§ãªãå Žåã¯åã«ãããè¿ããŸã-ãããããé 延åæåã
2ïŒèšå®å€ãçŸåšã®å€ãšç°ãªãå Žåã«ã®ã¿putãèšå®ããŸã-ããã«ãããputãã¢ã€ãã«ç¶æ ã§å®è¡ãããªããªããŸãã
ããšãã°ãã³ã³ãããä»ããŠã®ã¿ããã¥ã¡ã³ãã®ååãæäœããå Žåãé ããã©ãŠã¶APIã«å床ã¢ã¯ã»ã¹ããå¿ èŠããªãããã«å®çŸ©ã§ããŸãã
var doc = { get title( ) { return new $jin.prop.vary({ owner : this, name : '_title', put : function( next ) { document.title = next }, pull : function( ) { return document.title }, }) } } doc.title.set( 'Hello' ) // doc.title.get() // doc.title.update() //

æåŸã®2ã€ã®äŸã§ããã®ãããªé¢åãªããããã£ã®å®çŸ©ã«æ··ä¹±ããŠããå Žåã¯ããã®çç±ã説æããŸãã ãã®å Žåãããç°¡åã«å®çŸ©ã§ããŸãã
var doc = { title : new $jin.prop.vary({ put : function( next ) { document.title = next }, pull : function( ) { return document.title }, }) } doc.title.set( 'Hello' )

ãã®ãããç¶æ¿ããæ©èœãå¿ èŠãšããªãããããã£ã«å¯ŸããŠè¡ã䟡å€ããããŸãã ãã ããã¯ã©ã¹ã®ãããã¿ã€ãã§ãã®ãããªããããã£ã宣èšãããšããã¹ãŠã®ã€ã³ã¹ã¿ã³ã¹ãåãã³ã³ããã§æ©èœããŸãããããã¯éåžžå¿ èŠãªãã®ã§ã¯ãããŸããã ãã ããåã€ã³ã¹ã¿ã³ã¹ã«ã¯ç¬èªã®ã³ã³ãããå¿ èŠã§ãã ãããè¡ãã«ã¯ãã²ãã¿ãŒãä»ããŠã³ã³ãããäœæãããªããžã§ã¯ããžã®ãªã³ã¯ãšãã®äžã®ãã£ãŒã«ãåãæž¡ããŸã-ã³ã³ãããããŒã¿ãä¿åããïŒãŸãã¯å®è£ ã«ãã£ãŠç°ãªããŸãïŒ ãã®ãããªã²ãã¿ãŒã䜿çšãããã1ã€ã®é¡èãªäŸã¯ãä»»æã®æ°ã®ããŒãæã€é 延ã¬ãžã¹ããªã§ãã
var info = { item : function( key ) { return new $jin.prop.vary({ owner : this, name : '_item:' + key, pull : function( ) { return 0 }, }) } } info.item( 'foo' ).get() // 0 info.item( 'bar' ).set( 123 ) info.item( 'bar' ).get() // 123

æåŸã«ãäžè¬çãªç¶æ³ã¯å¥ã®ããããã£ã«å§ä»»ããŠããŸãïŒ
var user = { get name ( ) { return new $jin.prop.vary({ owner : this , name : '_name' , pull : function( prev ) { return 'Anonymous' } }) } } var app = { get userName ( ) { return user.name } } app.userName.get() // Anonymous app.userName.set( 'Alice' ) // Anonymous app.userName.get() // Alice

åå¿ç¹æ§
ããã§ãæåã®ã¢ãã ãäœæããæºåãã§ããŸããã
var message = new $jin.atom.prop( { notify : function( next, prev ) { document.body.innerText = next }, fail : function( error ) { document.body.innerText += ' ' + error.message }, } ) message.push( 'Hello' ) // message.fail( new Error( 'Exception' ) ) //

ããã§ã¯ãã¹ãŠãç°¡åã§ã-ã¢ãã ã®å€ãå€æŽãããšãéç¥ïŒãŸãã¯å€±æïŒé¢æ°ãããã«åŒã³åºãããŸãããã®é¢æ°ã§ã¯ãop-timeã«ç¶æ ã®å€æŽã匷å¶çã«åæ ã§ããŸãã éåžžãã¢ããªã±ãŒã·ã§ã³ã®FRPã³ãŒãã¯ããã®ãããªæååæãå®éã«å¿ èŠãšããŸããããããã®ã»ãšãã©ã¯ãåæ§ã®åæã¢ãã ããã§ã«èªåçã«çæãããWerskã®å®£èšçãªèšè¿°ã«ãã£ãŠç°¡åã«åé€ãããŸãã ããããããã¯å¥ã®å€§ããªèšäºã®ãããã¯ãªã®ã§ãããã«ååèªäœã®æ©èœã«éäžããŸãã
ã¢ãã ã¯ãçŽæãã®äžè¬åã§ããããã thenableã€ã³ã¿ãŒãã§ã€ã¹ããµããŒãããããšã¯é©ãããšã§ã¯ãããŸããã
var message = new $jin.atom.prop({}) message.then( function( next ) { document.body.innerText = next }, function( error ) { document.body.innerText += ' ' + error.message } ) message.push( 'Hello' ) // message.fail( new Error( 'Exception' ) ) // ,

çŽæã®å¶éã«çæããããšãéèŠã§ãã
1.ãã³ãã©ã¯é 延ãšåŒã°ããŸã
2.ãã³ãã©ãŒã¯1åã ãåŒã³åºãããŸã
thenã¡ãœããã¯ãå ã®ã¢ãã ããªãã¹ã³ããã¢ãã ãè¿ããæªå®çŸ©ã®å€ãåãå ¥ãããšããã³ãã©ãŒãåŒã³åºããŠèªå·±ç Žå£ããŸãã
ãããŠä»ãæåŸã«ãFRPã®åäœïŒ
var user = { firstName : new $jin.atom.prop({ value : 'Alice' }), lastName : new $jin.atom.prop({ value : 'McGee' }), getFullName : function(){ // fullName : new $jin.prop.proxy(...) return user.firstName.get() + ' ' + user.lastName.get() } } var message = new $jin.atom.prop( { pull : function( ) { return 'Hello, ' + user.getFullName() }, notify : function( next , prev ) { document.body.innerText = next }, reap : function( ) { } } ) message.get() user.firstName.push( 'Alice' ) // setTimeout( function( ) { user.lastName.push( 'Bob' ) // }, 1000 )

ããã§ã¯ãäžè¬ã«ããã¹ãŠãåçŽã§ããã¡ãã»ãŒãžã¯ãuser.firstNameããããã£ãšuser.lastNameããããã£ã®é¢æ°ãšããŠæé»çã«å®£èšãããå°ãªããšã1ã€ãå€æŽããããšãã¡ãã»ãŒãžãå€æŽãããããã¥ã¡ã³ãã«åæ ãããŸãã ããã«ã¯2ã€ã®æ©èœããããŸãã
1.ååã¯æ ãè ã§ãã 誰ããïŒgetãŸãã¯pullãä»ããŠïŒãããããã«ãããŸã§ããããã¯éã¢ã¯ãã£ãã«ãªããŸãã
2.ååã¯èªæ®ºã§ãã reapã®æ¯ãèããåå®çŸ©ããªããšããããã«äŸåããåäžã®ã¢ãã ããªãå Žåãã¢ãã ã¯èªèº«ãç Žå£ããã¡ã¢ãªã解æŸããŸãã
ãã€ã³ã¿ãŒã®åº§æšã«åŸãã¢ãã ãå®è£ ããŸãããïŒ
// var pointer = { handler : function( event ) { var point = event.changedTouches ? event.changedTouches[0] : event // pointer.position.push([ point.clientX , point.clientY ]) event.preventDefault() }, position : new $jin.atom.prop( { pull : function( prev ) { // document.body.addEventListener( 'mousemove' , pointer.handler , false ) document.body.addEventListener( 'dragover' , pointer.handler , false ) document.body.addEventListener( 'touchmove' , pointer.handler , false ) document.body.addEventListener( 'pointermove' , pointer.handler , false ) // , return [ -1, -1 ] }, reap : function( ) { // // - document.body.removeEventListener( 'mousemove' , pointer.handler , false ) document.body.removeEventListener( 'dragover' , pointer.handler , false ) document.body.removeEventListener( 'touchmove' , pointer.handler , false ) document.body.removeEventListener( 'pointermove' , pointer.handler , false ) // , pull pointer.position.clear() } } ) } // var title = new $jin.atom.prop( { pull : function( ) { return 'Mouse coords: ' + pointer.position.get() }, notify : function( next , prev ) { document.body.innerText = next }, reap : function( ) { } } ) title.pull() // 5 setTimeout( function( ) { title.disobeyAll() }, 5000 )

åä»ãåå
æã ãã¢ãã ã®å€ãå€æŽãããšããåºæ¬çãªãã®ãšã¯ç°ãªãç¹å¥ãªè«çãå¿ èŠã§ãïŒãæ°ããæŠå¿µãå€ãæŠå¿µã眮ãæããŸããã ããšãã°ãDateã€ã³ã¹ã¿ã³ã¹ãã¢ãã ã«ä¿åãããŠããå Žåãã¢ãã ã«è²Œãä»ãããããšãã«ç¢ºèªãããšäŸ¿å©ã§ãã ãããã圌ã¯æ¬åœã«å¥ã®ã¿ã€ã ã¹ã¿ã³ããæããŠããŸããã ããã¯ãããŒãžã€ã³ã¿ãŒãã§ã€ã¹ãåå®çŸ©ããããšã«ãã£ãŠè¡ãããŸãã
var lastUpdated = new $jin.atom.prop( { merge : function( next , prev ) { if( !prev ) return next if( prev.getTime() === next.getTime() ) return prev return next }, notify : function( next , prev ) { document.body.innerText += next.getFullYear() } } ) lastUpdated.push( new Date( 2014 , 1 , 1 ) ) // 2014 lastUpdated.push( new Date( 2014 , 1 , 1 ) ) // lastUpdated.push( new Date( 2015 , 1 , 1 ) ) // 2015
ååã瀺ãããã«ãããŒãžã€ã³ã¿ãŒãã§ã€ã¹ã¯éåžžãå€ããã§ãã¯ããã ãã§ãªããããŒãžããŸãã ããšãã°ãããŒããšã«ç°ãªãããŒã¿ãæ ŒçŽããå¿ èŠããããŸãã
var userInfo = new $jin.atom.prop( { value : {}, merge : function( next , prev ) { // var updated = false for( var key in next ) { if( prev[ key ] === next[ key ] ) continue prev[ key ] = next[ key ] updated = true } // , if( updated ) this.notify() return prev } }) userInfo.push({ firstName : 'Alice' }) userInfo.push({ lastName : 'McGee' }) userInfo.get() // { firstName: "Alice", lastName: "McGee" }
ããããã£ã®ç« ã§ã¯ãå€æ°ãšããããã£ã®äž»èŠãªã€ã³ã¿ãŒãã§ãŒã¹ããªã¹ãããŸããããä»ã«ãå€ãã®ã€ã³ã¿ãŒãã§ãŒã¹ããããŸãã
a ++ // 1 a += N // N //
ãããã®ã€ã³ã¿ãŒãã§ã€ã¹ã¯ããªããã£ãçšã§ãã ãããã®åäœã¯å³å¯ã«å®çŸ©ãããŠãããåå®çŸ©ã§ããŸããã ããããã«ã¹ã¿ã ã³ã³ããããããŸãïŒ æ°å€çšã®ã³ã³ãããæžããŸãããïŒ
module $jin.atom { export class numb < OwnerType extends $jin.object > extends $jin.atom.prop < number , OwnerType > { summ( value ) { this.set( this.get() + value ) } multiply( value ) { this.set( this.get() * value ) } // } } var count = new $jin.atom.numb({ value : 5 }) // count.summ( -1 ) // 1 count.multiply( 2 ) // count.get() // (8)
ããã§ã¯ãJavaScriptã§ã®ç¶æ¿ã¯ãåãã¬ãŒã ã¯ãŒã¯ããããå®è£ ããç¬èªã®ãã«ããŒãæã£ãŠãããããããŸãæ確ã§ã¯ãªããããTypeScriptã¯ãã§ã«äŸã§äœ¿çšãããŠããŸãã $ jin.atom.propããã³$ jin.atom.numbãšåæ§ã«ãããã䜿çšã§ããæ®ãã¯ãã¹ãŠæãäžè¬çãªjavascriptã®ããããã¿ã€ãé¢æ°ãã§ãã
ãã ããããªããã£ãã«éå®ãããŸãã-ããšãã°ãã³ã¬ã¯ã·ã§ã³ã«ã¢ãã ã䜿çšãããšäŸ¿å©ã§ãã
module $jin.atom { // export class list<ItemType,OwnerType extends $jin.object> extends $jin.atom.prop<ItemType[],OwnerType> { // , merge( next : ItemType[] , prev : ItemType[] ) { next = super.merge( next , prev ) if( !next || !prev ) return next if( next.length !== prev.length ) return next for( var i = 0 ; i < next.length ; ++i ) { if( next[ i ] !== prev[ i ] ) return next } return prev } // append( values : ItemType[] ) { var value = this.get() value.push.apply( value, values ) this.notify( null , value ) // } // prepend( values : ItemType[] ) { var value = this.get() value.unshift.apply( value, values ) this.notify( null , value ) } // } } var list = new $jin.atom.list({ value : [ 3 ] }) list.append([ 4 , 5 ]) list.prepend([ 1 , 2 ]) list.get() // [ 1 , 2 , 3 , 4 , 5 ]
ãŸãšã
ããŠãããã¯ããªãèªèº«ã®ããã«ãããè©ŠããŠã¿ãæéã§ãã ããããæåã«ããããžã§ã¯ããçŽç²ãªç±æã§çããŠããããšãã³ãã¥ããã£ãŸãã¯æè³ãªãã§ãäžäººã®ã¡ã€ã³ã®ä»äºããäœæã«éçºãããŠããããšãèŠåããå¿ èŠããããŸãã ãã®ãããã¯ã«èå³ãããå Žåã¯ãé æ ®ãªã質åãããã質åãå ±åããããã¢ã€ãã¢ãè¡šæããããããããéã£ããããŠãã ããã
JSã³ã³ãã€ã«æžã¿ã©ã€ãã©ãª ã27KBãå§çž®ãªã
TypeScriptãœãŒã¹
JSFiddle調é
äž»ãªã¯ã©ã¹ïŒ
$ jin.prop.proxy-ã¹ããŒãã¬ã¹ããããã£
$ jin.prop.vary-ç¶æ ããããã£
$ jin.atom.prop-ãªã¢ã¯ãã£ãããããã£
ãã¶ã€ããŒãã©ã¡ãŒã¿ãŒïŒãã¹ãŠãªãã·ã§ã³ïŒïŒ
owner-ã¢ãã ã®ææè ãobjectPathãã£ãŒã«ãã«ã°ããŒãã«ã«äžæã®èå¥åãå¿ èŠã§ã
name-ææè å ã§äžæã®ååå
å€-åæå€
getïŒå€ïŒTïŒïŒT-å€ã®åãªã¯ãšã¹ãã§åŒã³åºãããããã©ã«ãã§ã¯ãã©ã¡ãŒã¿ãŒããããã·ããŸã
pullïŒåïŒTïŒïŒT-äž»èŠãªç¶æ ïŒãµãŒããŒãªã©ïŒããå€ãããã«ãããããã«åŒã³åºãããŸããããã©ã«ãã§ã¯çŸåšã®å€ãè¿ããŸã
mergeïŒæ¬¡ïŒTãåïŒTïŒïŒT-æ°ããå€ãçŸåšã®å€ãšæ€èšŒããã³/ãŸãã¯ããŒãžããããã«åŒã³åºãããŸããããã©ã«ãã§ã¯æ°ããå€ãè¿ããŸã
putïŒnextïŒTãprevïŒTïŒïŒvoid-pullãšå察ã®æäœã§ãæ°ããå€ããªãŒãã£ã³ã°ã¹ããŒãïŒãµãŒããŒãªã©ïŒã«è»¢éããŸããããã©ã«ãã§ã¯ãæ°ããå€ãatomã«æžã蟌ã¿ãŸã
reapïŒïŒïŒvoid-åŒã³åºãããŸãã 誰ãååã«ãµãã¹ã¯ã©ã€ããããŠãââãããå®å šã«åé€ã§ããå Žåããããããã©ã«ãã®åäœã§ã
notifyïŒnextïŒTãprevïŒTïŒïŒvoid-çŸåšã®å€ãå€æŽããããšåŒã³åºãããŸããããã©ã«ãã§ã¯äœãããŸãã
failïŒãšã©ãŒïŒãšã©ãŒïŒïŒvoid-çŸåšã®å€ã®ä»£ããã«äŸå€ãªããžã§ã¯ããä¿åããããšãã«åŒã³åºãããŸã
ååã®åºæ¬çãªæ¹æ³ïŒ
getïŒïŒ-å€ãååŸ
pullïŒïŒ-åã®å€ã®èšç®
updateïŒïŒ-ã¹ã±ãžã¥ãŒã«å€ã®æŽæ°
setïŒïŒ-æ°ããå€ãæäŸããŸãïŒããèªäœã«æžã蟌ãã®ã§ã¯ãªããå é ã®ç¶æ ã«æžã蟌ãå ŽåããããŸãïŒ
pushïŒïŒ-æ°ããå€ã匷å¶çã«æžã蟌ã
failïŒãšã©ãŒïŒ-æžã蟌ã¿äŸå€ãªããžã§ã¯ãã匷å¶ããŸã
mutateïŒïŒåïŒTïŒ=> TïŒ-å€æé¢æ°ãé©çšããŸã
thenïŒïŒnextïŒT1ïŒ=> T2ïŒ-ã¢ãã ãå®éã®å€ããšããšãã«é¢æ°ãå®è¡ãã
catchïŒïŒerrorïŒErrorïŒ=> T2ïŒ-ã¢ãã ãäŸå€ãªããžã§ã¯ããåãå ¥ãããšãã«é¢æ°ãå®è¡ãã