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 ..