ããã«ã¡ã¯ãç§ã®ååã¯Dmitry Karlovskyãšç§ã¯ããã®ãµã€ã¯ãªã¹ãã§ãã ç§ã®äººçã®äžã§ãç§ã¯ããããã®éã®éŠ¬ãè©ŠããŸããããæçµçã«ã¯éã«åããã«èœã¡çããŸããã ãã€ãŒã«ã®çºæã«å€ãã®èªç±æéãè²»ãããŠãã¡ã€ã«ãæ±ãããšãæ¬åœã«å¥œãã ã£ããšããããã§ã¯ãããŸããããæçµçµæã¯ãåãã³ããäžå身ã«çã¿ãäžããªããšãã䟡å€ããããŸãã ãããŠä»ãããªããç§ãçç±ã®ãã¹ãŠã®ããã«ããããã¹ãŠå§ããããšãç¥ã£ãŠããããäžçãããè¯ãå Žæã«ããããã«ãTypeScript / JavaScriptã¢ãžã¥ãŒã«$ jin.atomã玹ä»ãããŠãã ããã
åã®ã·ãªãŒãºã®èŠçŽïŒæãåçŽãªã¢ããªã±ãŒã·ã§ã³ã¯ãéåžžã«è€éãªã¬ãã«ã«éããŸãããããã«å¯ŸåŠããããã«ãæœè±¡åãã¢ãã ããå°å
¥ãããŸããã ã ãã¹ãŠã®çè«ãšåçããããŸãã ããããã®ç·Žç¿ãã³ãŒãã®äŸãã³ã³ãœãŒã«ã®ãã³ãããããŸãã
TypeScriptã䜿çšããçç±
ã¢ãžã¥ãŒã«ã®æåã®å®è£
ã¯çŽç²ãªJavaScriptã§ããããæè¿TypeScriptã§æžãçŽãããŸããã TypeScriptã¯ã»ãšãã©åãJavaScriptã§ãããã¯ã©ã¹ãåæšè«ãããã³éåžžã®ã©ã ãããããŸãã ãã以äžã®å€æŽã¯ãããŸããããã®çµæãéåžžã®JavaScriptã³ãŒããšéåžžã«ããçµ±åãããŸãã JavaScriptããTypeScriptã¢ãžã¥ãŒã«ã«çŽæ¥ã¢ã¯ã»ã¹ã§ãããã®éãå¯èœã§ãã ããã§ãªãéããéçåä»ããæäŸããå©ç¹ã倱ããªãããã«ãJSããããããç°å¢å®£èšããèšè¿°ããããšããå§ãããŸãã ãããŠã圌女ã¯ä»¥äžã®ããŒãã¹ãäžããŸãïŒ
* IDEã®ãã³ãã¯ããã¹ãŠã®ã¯ã©ã¹ã®ãã¹ãŠã®ã¡ãœãããšããããã£ã«é¢ããããã¥ã¡ã³ããèŠããŠããå¿
èŠããããã°ã©ãã解æŸããŸãã
*ãšã³ãã£ãã£ã®ãã¹ãŠã®äœ¿çšå Žæãæ€çŽ¢ããŸã-ãªãã¡ã¯ã¿ãªã³ã°ã«äžå¯æ¬ ã§ãã
*ç·šé/ã¢ã»ã³ããªæ®µéã§ã®ã¢ããªã±ãŒã·ã§ã³ã®ç°ãªãéšåéã®åã®äžäžèŽã®èå¥ã
æ®å¿µãªãããæ¬ ç¹ããããŸãã
*æã«ã¯ãã¿ã³ããªã³ãšèžããªãããã³ã³ãã€ã©ãŒã«ããªãã®èšã£ãŠããããšã説æããªããã°ãªããŸããã
TypeScriptã«ã¯2ã€ã®éžæè¢ããããŸãã
JSDocã¯ãã³ã¡ã³ãå
ã®åçã³ãŒããéçã«èšè¿°ããããã®éåžžã«éè¡šçŸçãªåœ¢åŒã§ãã å€ãã®å ŽåãJSDocã³ã¡ã³ãã®éïŒå£é ã§ã®èª¬æãèæ
®ã«å
¥ããªãïŒã¯ãå®éã«åœ¹ç«ã€ã³ãŒã以äžã®ãã®ã§ãã é©åãªäºäŸïŒ
function onTitleChange( handler ){
Dart-å¥ã®èšèªãåžãããJavaScriptã§æŸéãããããã«èšèšãããŠããã å®å
šã«ç°ãªãã€ãã£ãªã ã䜿çšããŸããããã¯ãJavaScriptã³ãŒããšçµ±åããå Žåã«å€ãã®å¶éããããã¡ã¢ãªæ¶è²»éãéåžžã«å€ããããçµã¿èŸŒã¿ã®ãã©ãŠã¶ãŒããŒã«ã䜿çšããŠãããã°ããå Žåã®åé¡ããããDartããçæãããã³ãŒãã¯éåžžã«èšå€§ãªéººã§ãã äžèšã®äŸã§ã¯ã次ã®ããã«ãªããŸãã
typedef void onTitleChange_handler( String next , String prev ); onTitleChange( onTitleChange_handler handler ){
ãã§ã«åªããŠããŸãããååä»ãã®ã€ã³ã¿ãŒãã§ã€ã¹/ã¿ã€ããå€ãããããšãå¿
èŠã§ãã ããã¯äž»æ Œã¿ã€ãã³ã°ã®äž»ãªæ¬ ç¹ã§ãã
TypeScriptã¯æ§é ã䜿çšããŸãïŒ
function onTitleChange( handler : ( next : string , prev : string ) => void ){
ãã ããå¿
èŠã«å¿ããŠãã€ã³ã¿ãŒãã§ã€ã¹ã«ååãä»ããããšãã§ããŸãã
interface onTitleChange_handler { ( next : string , prev : string ) : void } function onTitleChange( handler : onTitleChange_handler ){
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
ãã1ã€ã®ãããã»ã©ããç¥ãããŠããªãã³ã³ããã¯ãªããžã§ã¯ããã£ãŒã«ãã§ãã ãã¹ãŠã®å¯å€ã€ã³ã¿ãŒãã§ãŒã¹ããµããŒãããŸãïŒ
obj.count = 2
ãããããããã«å ããŠããã£ãŒã«ãã¯ããã«ããã€ãããµããŒãããŸãïŒ
delete obj.field
ã芧ã®ããã«ãå€ãã®ã€ã³ã¿ãŒãã§ãŒã¹ã¯ãªããèŠãç®ã¯å®å
šã«ç°ãªã£ãŠããŸãã ééããªãã¢ãã ãå«ãŸããããè€éãªã³ã³ãããå®è£
ããã«ã¯ãããã«å€ãã®ã€ã³ã¿ãŒãã§ã€ã¹ãå¿
èŠãªã®ã§ããã®ãããªã³ã³ãããã¯ã©ã¹ãšããŠå®è£
ããŸãã å€æ°ã®å®è£
ã¯æ¬¡ã®ããã«ãªããŸãã
var count = new $jin.prop.vary({})

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

$ 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' )

ãã®å Žåã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' )

æåŸã®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()

æåŸã«ãäžè¬çãªç¶æ³ã¯å¥ã®ããããã£ã«å§ä»»ããŠããŸãïŒ
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()

åå¿ç¹æ§
ããã§ãæåã®ã¢ãã ãäœæããæºåãã§ããŸããã
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' )

ããã§ã¯ãã¹ãŠãç°¡åã§ã-ã¢ãã ã®å€ãå€æŽãããšãéç¥ïŒãŸãã¯å€±æïŒé¢æ°ãããã«åŒã³åºãããŸãããã®é¢æ°ã§ã¯ã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' )

çŽæã®å¶éã«çæããããšãéèŠã§ãã
1.ãã³ãã©ã¯é
延ãšåŒã°ããŸã
2.ãã³ãã©ãŒã¯1åã ãåŒã³åºãããŸã
thenã¡ãœããã¯ãå
ã®ã¢ãã ããªãã¹ã³ããã¢ãã ãè¿ããæªå®çŸ©ã®å€ãåãå
¥ãããšããã³ãã©ãŒãåŒã³åºããŠèªå·±ç Žå£ããŸãã
ãããŠä»ãæåŸã«ãFRPã®åäœïŒ
var user = { firstName : new $jin.atom.prop({ value : 'Alice' }), lastName : new $jin.atom.prop({ value : 'McGee' }), getFullName : function(){

ããã§ã¯ãäžè¬ã«ããã¹ãŠãåçŽã§ããã¡ãã»ãŒãžã¯ãuser.firstNameããããã£ãšuser.lastNameããããã£ã®é¢æ°ãšããŠæé»çã«å®£èšãããå°ãªããšã1ã€ãå€æŽããããšãã¡ãã»ãŒãžãå€æŽãããããã¥ã¡ã³ãã«åæ ãããŸãã ããã«ã¯2ã€ã®æ©èœããããŸãã
1.ååã¯æ ãè
ã§ãã 誰ããïŒgetãŸãã¯pullãä»ããŠïŒãããããã«ãããŸã§ããããã¯éã¢ã¯ãã£ãã«ãªããŸãã
2.ååã¯èªæ®ºã§ãã reapã®æ¯ãèããåå®çŸ©ããªããšããããã«äŸåããåäžã®ã¢ãã ããªãå Žåãã¢ãã ã¯èªèº«ãç Žå£ããã¡ã¢ãªã解æŸããŸãã
ãã€ã³ã¿ãŒã®åº§æšã«åŸãã¢ãã ãå®è£
ããŸãããïŒ

åä»ãåå
æã
ãã¢ãã ã®å€ãå€æŽãããšããåºæ¬çãªãã®ãšã¯ç°ãªãç¹å¥ãªè«çãå¿
èŠã§ãïŒãæ°ããæŠå¿µãå€ãæŠå¿µã眮ãæããŸããã ããšãã°ã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 ) )
ååã瀺ãããã«ãããŒãžã€ã³ã¿ãŒãã§ã€ã¹ã¯éåžžãå€ããã§ãã¯ããã ãã§ãªããããŒãžããŸãã ããšãã°ãããŒããšã«ç°ãªãããŒã¿ãæ ŒçŽããå¿
èŠããããŸãã
var userInfo = new $jin.atom.prop( { value : {}, merge : function( next , prev ) {
ããããã£ã®ç« ã§ã¯ãå€æ°ãšããããã£ã®äž»èŠãªã€ã³ã¿ãŒãã§ãŒã¹ããªã¹ãããŸããããä»ã«ãå€ãã®ã€ã³ã¿ãŒãã§ãŒã¹ããããŸãã
a ++
ãããã®ã€ã³ã¿ãŒãã§ã€ã¹ã¯ããªããã£ãçšã§ãã ãããã®åäœã¯å³å¯ã«å®çŸ©ãããŠãããåå®çŸ©ã§ããŸããã ããããã«ã¹ã¿ã ã³ã³ããããããŸãïŒ æ°å€çšã®ã³ã³ãããæžããŸãããïŒ
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 ) }
ããã§ã¯ãJavaScriptã§ã®ç¶æ¿ã¯ãåãã¬ãŒã ã¯ãŒã¯ããããå®è£
ããç¬èªã®ãã«ããŒãæã£ãŠãããããããŸãæ確ã§ã¯ãªããããTypeScriptã¯ãã§ã«äŸã§äœ¿çšãããŠããŸãã $ jin.atom.propããã³$ jin.atom.numbãšåæ§ã«ãããã䜿çšã§ããæ®ãã¯ãã¹ãŠæãäžè¬çãªjavascriptã®ããããã¿ã€ãé¢æ°ãã§ãã
ãã ããããªããã£ãã«éå®ãããŸãã-ããšãã°ãã³ã¬ã¯ã·ã§ã³ã«ã¢ãã ã䜿çšãããšäŸ¿å©ã§ãã
module $jin.atom {
ãŸãšã
ããŠãããã¯ããªãèªèº«ã®ããã«ãããè©ŠããŠã¿ãæéã§ãã ããããæåã«ããããžã§ã¯ããçŽç²ãªç±æã§çããŠããããšãã³ãã¥ããã£ãŸãã¯æè³ãªãã§ãäžäººã®ã¡ã€ã³ã®ä»äºããäœæã«éçºãããŠããããšãèŠåããå¿
èŠããããŸãã ãã®ãããã¯ã«èå³ãããå Žåã¯ãé æ
®ãªã質åãããã質åãå ±åããããã¢ã€ãã¢ãè¡šæããããããããéã£ããããŠãã ããã
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ïŒ-ã¢ãã ãäŸå€ãªããžã§ã¯ããåãå
¥ãããšãã«é¢æ°ãå®è¡ãã
