⌈⌋ ⎇ branch:  Bitrhythm


Hex Artifact Content

Artifact a5fef63a1fe89e1f5c39642714466031c78a0808cb1e74a0bada6a4310aba271:


0000: 27 75 73 65 20 73 74 72 69 63 74 27 3b 0d 0a 0d  'use strict';...
0010: 0a 69 6d 70 6f 72 74 20 6d 61 74 68 20 66 72 6f  .import math fro
0020: 6d 20 27 2e 2e 2f 75 74 69 6c 2f 6d 61 74 68 27  m '../util/math'
0030: 3b 0d 0a 69 6d 70 6f 72 74 20 44 72 75 6e 6b 20  ;..import Drunk 
0040: 66 72 6f 6d 20 27 2e 2f 64 72 75 6e 6b 27 3b 0d  from './drunk';.
0050: 0a 0d 0a 65 78 70 6f 72 74 20 64 65 66 61 75 6c  ...export defaul
0060: 74 20 63 6c 61 73 73 20 53 65 71 75 65 6e 63 65  t class Sequence
0070: 20 7b 0d 0a 0d 0a 20 20 20 20 63 6f 6e 73 74 72   {....    constr
0080: 75 63 74 6f 72 28 73 65 71 75 65 6e 63 65 20 3d  uctor(sequence =
0090: 20 5b 30 2c 31 30 2c 32 30 2c 33 30 5d 2c 20 6d   [0,10,20,30], m
00a0: 6f 64 65 3d 27 75 70 27 2c 20 70 6f 73 69 74 69  ode='up', positi
00b0: 6f 6e 3d 66 61 6c 73 65 29 20 7b 0d 0a 20 20 20  on=false) {..   
00c0: 20 20 20 20 20 74 68 69 73 2e 76 61 6c 75 65 73       this.values
00d0: 20 3d 20 73 65 71 75 65 6e 63 65 3b 0d 0a 20 20   = sequence;..  
00e0: 20 20 20 20 20 20 69 66 20 28 21 41 72 72 61 79        if (!Array
00f0: 2e 69 73 41 72 72 61 79 28 74 68 69 73 2e 76 61  .isArray(this.va
0100: 6c 75 65 73 29 29 20 7b 0d 0a 20 20 20 20 20 20  lues)) {..      
0110: 20 20 20 20 74 68 69 73 2e 76 61 6c 75 65 73 20      this.values 
0120: 3d 20 5b 74 68 69 73 2e 76 61 6c 75 65 73 5d 3b  = [this.values];
0130: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
0140: 20 20 20 20 20 74 68 69 73 2e 5f 6d 6f 64 65 20       this._mode 
0150: 3d 20 6d 6f 64 65 3b 0d 0a 20 20 20 20 20 20 20  = mode;..       
0160: 20 74 68 69 73 2e 70 6f 73 69 74 69 6f 6e 20 3d   this.position =
0170: 20 70 6f 73 69 74 69 6f 6e 3b 0d 0a 0d 0a 20 20   position;....  
0180: 20 20 20 20 20 20 74 68 69 73 2e 64 72 75 6e 6b        this.drunk
0190: 57 61 6c 6b 20 3d 20 6e 65 77 20 44 72 75 6e 6b  Walk = new Drunk
01a0: 28 30 2c 20 74 68 69 73 2e 76 61 6c 75 65 73 2e  (0, this.values.
01b0: 6c 65 6e 67 74 68 20 2d 20 31 29 3b 0d 0a 0d 0a  length - 1);....
01c0: 20 20 20 20 20 20 20 20 74 68 69 73 2e 73 74 61          this.sta
01d0: 72 74 56 61 6c 75 65 73 20 3d 20 7b 0d 0a 20 20  rtValues = {..  
01e0: 20 20 20 20 20 20 20 20 27 75 70 27 3a 20 30 2c          'up': 0,
01f0: 0d 0a 20 20 20 20 20 20 20 20 20 20 27 64 6f 77  ..          'dow
0200: 6e 27 3a 20 74 68 69 73 2e 76 61 6c 75 65 73 2e  n': this.values.
0210: 6c 65 6e 67 74 68 20 2d 20 31 2c 0d 0a 20 20 20  length - 1,..   
0220: 20 20 20 20 20 20 20 27 64 72 75 6e 6b 27 3a 20         'drunk': 
0230: 7e 7e 28 74 68 69 73 2e 76 61 6c 75 65 73 2e 6c  ~~(this.values.l
0240: 65 6e 67 74 68 2f 32 29 2c 0d 0a 20 20 20 20 20  ength/2),..     
0250: 20 20 20 20 20 27 72 61 6e 64 6f 6d 27 3a 20 6d       'random': m
0260: 61 74 68 2e 72 69 28 74 68 69 73 2e 76 61 6c 75  ath.ri(this.valu
0270: 65 73 2e 6c 65 6e 67 74 68 29 0d 0a 20 20 20 20  es.length)..    
0280: 20 20 20 20 7d 3b 0d 0a 0d 0a 20 20 20 20 20 20      };....      
0290: 20 20 69 66 20 28 74 68 69 73 2e 70 6f 73 69 74    if (this.posit
02a0: 69 6f 6e 21 3d 3d 66 61 6c 73 65 29 20 7b 0d 0a  ion!==false) {..
02b0: 20 20 20 20 20 20 20 20 20 20 74 68 69 73 2e 6e            this.n
02c0: 65 78 74 20 3d 20 74 68 69 73 5b 74 68 69 73 2e  ext = this[this.
02d0: 5f 6d 6f 64 65 5d 3b 0d 0a 20 20 20 20 20 20 20  _mode];..       
02e0: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
02f0: 20 20 20 20 20 74 68 69 73 2e 6e 65 78 74 20 3d       this.next =
0300: 20 74 68 69 73 2e 66 69 72 73 74 3b 0d 0a 20 20   this.first;..  
0310: 20 20 20 20 20 20 7d 0d 0a 0d 0a 0d 0a 20 20 20        }......   
0320: 20 7d 0d 0a 0d 0a 20 20 20 20 67 65 74 20 6d 6f   }....    get mo
0330: 64 65 28 29 20 7b 0d 0a 20 20 20 20 20 20 72 65  de() {..      re
0340: 74 75 72 6e 20 74 68 69 73 2e 5f 6d 6f 64 65 3b  turn this._mode;
0350: 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 73  ..    }....    s
0360: 65 74 20 6d 6f 64 65 28 6d 6f 64 65 29 20 7b 0d  et mode(mode) {.
0370: 0a 20 20 20 20 20 20 20 20 69 66 20 28 21 28 6d  .        if (!(m
0380: 6f 64 65 20 3d 3d 3d 20 27 75 70 27 20 7c 7c 20  ode === 'up' || 
0390: 6d 6f 64 65 20 3d 3d 3d 20 27 64 6f 77 6e 27 20  mode === 'down' 
03a0: 7c 7c 20 6d 6f 64 65 20 3d 3d 3d 20 27 72 61 6e  || mode === 'ran
03b0: 64 6f 6d 27 20 7c 7c 20 6d 6f 64 65 20 3d 3d 3d  dom' || mode ===
03c0: 20 27 64 72 75 6e 6b 27 29 29 20 7b 0d 0a 20 20   'drunk')) {..  
03d0: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 6f 6c            consol
03e0: 65 2e 65 72 72 6f 72 28 27 54 68 65 20 6f 6e 6c  e.error('The onl
03f0: 79 20 6d 6f 64 65 73 20 63 75 72 72 65 6e 74 6c  y modes currentl
0400: 79 20 61 6c 6c 6f 77 65 64 20 61 72 65 3a 20 75  y allowed are: u
0410: 70 2c 20 64 6f 77 6e 2c 20 72 61 6e 64 6f 6d 2c  p, down, random,
0420: 20 64 72 75 6e 6b 27 29 3b 0d 0a 20 20 20 20 20   drunk');..     
0430: 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0d 0a         return;..
0440: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
0450: 20 20 20 74 68 69 73 2e 5f 6d 6f 64 65 20 3d 20     this._mode = 
0460: 6d 6f 64 65 3b 0d 0a 20 20 20 20 20 20 20 20 69  mode;..        i
0470: 66 20 28 74 68 69 73 2e 70 6f 73 69 74 69 6f 6e  f (this.position
0480: 29 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74  ) {..          t
0490: 68 69 73 2e 6e 65 78 74 20 3d 20 74 68 69 73 5b  his.next = this[
04a0: 74 68 69 73 2e 5f 6d 6f 64 65 5d 3b 0d 0a 20 20  this._mode];..  
04b0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
04c0: 0d 0a 20 20 20 20 67 65 74 20 76 61 6c 75 65 28  ..    get value(
04d0: 29 20 7b 0d 0a 20 20 20 20 20 20 72 65 74 75 72  ) {..      retur
04e0: 6e 20 74 68 69 73 2e 76 61 6c 75 65 73 5b 74 68  n this.values[th
04f0: 69 73 2e 70 6f 73 69 74 69 6f 6e 5d 3b 0d 0a 20  is.position];.. 
0500: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 73 65 74 20     }....    set 
0510: 76 61 6c 75 65 28 76 29 20 7b 0d 0a 20 20 20 20  value(v) {..    
0520: 20 20 74 68 69 73 2e 70 6f 73 69 74 69 6f 6e 20    this.position 
0530: 3d 20 74 68 69 73 2e 76 61 6c 75 65 73 2e 69 6e  = this.values.in
0540: 64 65 78 4f 66 28 76 29 3b 0d 0a 20 20 20 20 7d  dexOf(v);..    }
0550: 0d 0a 0d 0a 20 20 20 20 66 69 72 73 74 28 29 20  ....    first() 
0560: 7b 0d 0a 20 20 20 20 20 20 69 66 20 28 74 68 69  {..      if (thi
0570: 73 2e 70 6f 73 69 74 69 6f 6e 21 3d 3d 66 61 6c  s.position!==fal
0580: 73 65 29 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  se) {..        t
0590: 68 69 73 2e 6e 65 78 74 20 3d 20 74 68 69 73 5b  his.next = this[
05a0: 74 68 69 73 2e 5f 6d 6f 64 65 5d 3b 0d 0a 20 20  this._mode];..  
05b0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 68 69        return thi
05c0: 73 2e 6e 65 78 74 28 29 3b 0d 0a 20 20 20 20 20  s.next();..     
05d0: 20 7d 0d 0a 20 20 20 20 20 20 74 68 69 73 2e 70   }..      this.p
05e0: 6f 73 69 74 69 6f 6e 20 3d 20 74 68 69 73 2e 73  osition = this.s
05f0: 74 61 72 74 56 61 6c 75 65 73 5b 74 68 69 73 2e  tartValues[this.
0600: 5f 6d 6f 64 65 5d 3b 0d 0a 20 20 20 20 20 20 74  _mode];..      t
0610: 68 69 73 2e 6e 65 78 74 20 3d 20 74 68 69 73 5b  his.next = this[
0620: 74 68 69 73 2e 5f 6d 6f 64 65 5d 3b 0d 0a 20 20  this._mode];..  
0630: 20 20 20 20 72 65 74 75 72 6e 20 74 68 69 73 2e      return this.
0640: 76 61 6c 75 65 3b 0d 0a 20 20 20 20 7d 0d 0a 0d  value;..    }...
0650: 0a 20 20 20 20 75 70 28 29 20 7b 0d 0a 20 20 20  .    up() {..   
0660: 20 20 20 74 68 69 73 2e 70 6f 73 69 74 69 6f 6e     this.position
0670: 2b 2b 3b 0d 0a 20 20 20 20 20 20 74 68 69 73 2e  ++;..      this.
0680: 70 6f 73 69 74 69 6f 6e 20 25 3d 20 74 68 69 73  position %= this
0690: 2e 76 61 6c 75 65 73 2e 6c 65 6e 67 74 68 3b 0d  .values.length;.
06a0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 68  .      return th
06b0: 69 73 2e 76 61 6c 75 65 3b 0d 0a 20 20 20 20 7d  is.value;..    }
06c0: 0d 0a 0d 0a 20 20 20 20 64 6f 77 6e 28 29 20 7b  ....    down() {
06d0: 0d 0a 20 20 20 20 20 20 74 68 69 73 2e 70 6f 73  ..      this.pos
06e0: 69 74 69 6f 6e 2d 2d 3b 0d 0a 20 20 20 20 20 20  ition--;..      
06f0: 69 66 20 28 74 68 69 73 2e 70 6f 73 69 74 69 6f  if (this.positio
0700: 6e 20 3c 20 30 29 20 7b 0d 0a 20 20 20 20 20 20  n < 0) {..      
0710: 20 20 74 68 69 73 2e 70 6f 73 69 74 69 6f 6e 20    this.position 
0720: 3d 20 28 74 68 69 73 2e 70 6f 73 69 74 69 6f 6e  = (this.position
0730: 20 2b 20 74 68 69 73 2e 76 61 6c 75 65 73 2e 6c   + this.values.l
0740: 65 6e 67 74 68 29 20 25 20 74 68 69 73 2e 76 61  ength) % this.va
0750: 6c 75 65 73 2e 6c 65 6e 67 74 68 3b 0d 0a 20 20  lues.length;..  
0760: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 72 65 74      }..      ret
0770: 75 72 6e 20 74 68 69 73 2e 76 61 6c 75 65 3b 0d  urn this.value;.
0780: 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 72 61  .    }....    ra
0790: 6e 64 6f 6d 28 29 20 7b 0d 0a 20 20 20 20 20 20  ndom() {..      
07a0: 74 68 69 73 2e 70 6f 73 69 74 69 6f 6e 20 3d 20  this.position = 
07b0: 6d 61 74 68 2e 72 69 28 30 2c 20 74 68 69 73 2e  math.ri(0, this.
07c0: 76 61 6c 75 65 73 2e 6c 65 6e 67 74 68 29 3b 0d  values.length);.
07d0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 68  .      return th
07e0: 69 73 2e 76 61 6c 75 65 3b 0d 0a 20 20 20 20 7d  is.value;..    }
07f0: 0d 0a 0d 0a 20 20 20 20 64 72 75 6e 6b 28 29 20  ....    drunk() 
0800: 7b 0d 0a 20 20 20 20 20 20 74 68 69 73 2e 64 72  {..      this.dr
0810: 75 6e 6b 57 61 6c 6b 2e 6d 61 78 20 3d 20 74 68  unkWalk.max = th
0820: 69 73 2e 76 61 6c 75 65 73 2e 6c 65 6e 67 74 68  is.values.length
0830: 3b 0d 0a 20 20 20 20 20 20 74 68 69 73 2e 64 72  ;..      this.dr
0840: 75 6e 6b 57 61 6c 6b 2e 76 61 6c 75 65 20 3d 20  unkWalk.value = 
0850: 74 68 69 73 2e 70 6f 73 69 74 69 6f 6e 3b 0d 0a  this.position;..
0860: 20 20 20 20 20 20 74 68 69 73 2e 70 6f 73 69 74        this.posit
0870: 69 6f 6e 20 3d 20 74 68 69 73 2e 64 72 75 6e 6b  ion = this.drunk
0880: 57 61 6c 6b 2e 6e 65 78 74 28 29 3b 0d 0a 20 20  Walk.next();..  
0890: 20 20 20 20 72 65 74 75 72 6e 20 74 68 69 73 2e      return this.
08a0: 76 61 6c 75 65 3b 0d 0a 20 20 20 20 7d 0d 0a 0d  value;..    }...
08b0: 0a 20 20 20 20 2f 2a 20 66 75 74 75 72 65 20 6d  .    /* future m
08c0: 65 74 68 6f 64 73 0d 0a 20 20 20 20 2e 67 72 6f  ethods..    .gro
08d0: 75 70 28 73 74 61 72 74 2c 73 74 6f 70 29 20 2d  up(start,stop) -
08e0: 2d 20 6f 75 74 70 75 74 73 20 61 20 67 72 6f 75  - outputs a grou
08f0: 70 20 6f 66 20 6e 20 69 74 65 6d 73 20 66 72 6f  p of n items fro
0900: 6d 20 74 68 65 20 6c 69 73 74 2c 20 77 69 74 68  m the list, with
0910: 20 77 72 61 70 70 69 6e 67 0d 0a 20 20 20 20 2e   wrapping..    .
0920: 6c 6f 6f 70 28 73 74 61 72 74 2c 73 74 6f 70 29  loop(start,stop)
0930: 20 2d 2d 20 63 6f 6e 66 69 6e 65 73 20 73 65 71   -- confines seq
0940: 75 65 6e 63 69 6e 67 20 74 6f 20 61 20 73 75 62  uencing to a sub
0950: 73 65 74 20 6f 66 20 74 68 65 20 76 61 6c 75 65  set of the value
0960: 73 0d 0a 20 20 20 20 20 20 20 20 28 63 6f 75 6c  s..        (coul
0970: 64 20 65 76 65 6e 20 68 61 76 65 20 61 20 64 69  d even have a di
0980: 73 74 69 6e 63 74 69 6f 6e 20 62 65 74 77 65 65  stinction betwee
0990: 6e 20 2e 6f 72 69 67 69 6e 61 6c 56 61 6c 75 65  n .originalValue
09a0: 73 20 61 6e 64 20 74 68 65 20 61 72 72 61 79 20  s and the array 
09b0: 6f 66 20 76 61 6c 75 65 73 20 62 65 69 6e 67 20  of values being 
09c0: 75 73 65 64 29 0d 0a 20 20 20 20 2a 2f 0d 0a 7d  used)..    */..}
09d0: 0d 0a                                            ..