fas-js 1.5.0 → 1.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -9,7 +9,7 @@
9
9
 
10
10
  Easily create and simulate state machines using this JS library. Import into your own server side or browser based JS application.
11
11
 
12
- > **Contributing:** See [CONTRIBUTING.md](CONTRIBUTING.md). v1.4 modernized the toolchain (TypeScript, tsup, demo, tests) without API changes — see [docs/v1.1-prep/](docs/v1.1-prep/) for the prep history.
12
+ > **Contributing:** See [CONTRIBUTING.md](CONTRIBUTING.md).
13
13
 
14
14
  ![FSA Example](img/fsa_example.png)
15
15
  ###### Visualization of an FSA
@@ -72,7 +72,7 @@ const alph_array = ["0", "1", "up", "down", "*"];
72
72
 
73
73
  Input array for DFAs must contain a transition for each alphabet symbol on each origin state. Thus, the size of δ = size of Σ x size of Q. Σ cannot contain an empty string as a symbol for DFAs.
74
74
 
75
- For NFAs, the `to` field can contain one or more destination states, comma separated, no spaces between state names. The `input` field can be `""`, indicating an ε (empty) transition.
75
+ For NFAs, the `to` field can contain one or more destination states, comma separated, no spaces between state names. The `input` field can be `""`, indicating an ε (empty) transition. In JSON and simulation, always use `""` for ε; graph labels may display ε (U+03B5). Pass multi-symbol alphabets as a string array (e.g. `["0", "1", "up", "down"]`) so each entry is one symbol — including UTF-8 characters.
76
76
  ```javascript
77
77
  const dfa_tfunc = [
78
78
  { from: "q1", to: "q2", input: "1" },
@@ -168,11 +168,11 @@ Interactive demos visualize FSAs as you simulate input strings.
168
168
 
169
169
  | Version | URL | Notes |
170
170
  |---------|-----|-------|
171
- | **v1.5** | [GitHub Pages demo](https://jml6m.github.io/fas-js/v1.5/) | FSA simulator + regular language lab (`demo/v1.5/`) |
171
+ | **v1.5+** | [GitHub Pages demo](https://jml6m.github.io/fas-js/v1.5/) | DFA/NFA simulator prebuilt examples, simulate/step, graph (`demo/v1.5/`) |
172
172
  | **v1.1** | [Redirect](https://jml6m.github.io/fas-js/v1.1/) | Preserved URL → v1.5 |
173
- | **v1** (legacy) | [ObservableHQ](https://observablehq.com/@jml6m/state-machine-simulator) | Original demo; kept for legacy reference |
173
+ | **v1** (legacy) | [ObservableHQ](https://observablehq.com/@jml6m/state-machine-simulator) | Original notebook |
174
174
 
175
- See [demo/README.md](demo/README.md) for local development and deployment details.
175
+ See [demo/README.md](demo/README.md) for version history, local development (`npm run serve:demo` on port 3200), automated tests, and deployment details.
176
176
 
177
177
  ## License
178
178
  This library is distributed under the GPL 3.0 license found in the [LICENSE](https://github.com/jml6m/fas-js/blob/master/LICENSE) file.
package/lib/bundle.js CHANGED
@@ -1,12 +1,12 @@
1
- "use strict";var fasJs=(()=>{var C=Object.defineProperty;var Q=Object.getOwnPropertyDescriptor;var Y=Object.getOwnPropertyNames;var W=Object.prototype.hasOwnProperty;var L=o=>{throw TypeError(o)};var X=(o,t)=>{for(var r in t)C(o,r,{get:t[r],enumerable:!0})},Z=(o,t,r,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of Y(t))!W.call(o,s)&&s!==r&&C(o,s,{get:()=>t[s],enumerable:!(i=Q(t,s))||i.enumerable});return o};var q=o=>Z(C({},"__esModule",{value:!0}),o);var M=(o,t,r)=>t.has(o)||L("Cannot "+r);var f=(o,t,r)=>(M(o,t,"read from private field"),r?r.call(o):t.get(o)),A=(o,t,r)=>t.has(o)?L("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(o):t.set(o,r),h=(o,t,r,i)=>(M(o,t,"write to private field"),i?i.call(o,r):t.set(o,r),r);var rt={};X(rt,{createFSA:()=>z,simulateFSA:()=>G,stepOnceFSA:()=>K});var p=Object.freeze({DUPLICATE_ALPHABET_VALS:"E-001",DUPLICATE_STATE_NAMES:"E-002",INVALID_STATE_NAME:"E-003",START_STATE_NOT_FOUND:"E-004",ACCEPTS_NOT_SUBSET:"E-005",ORIGIN_STATE_NOT_FOUND:"E-006",DEST_STATE_NOT_FOUND:"E-007",MISSING_REQUIRED_TRANSITION:"E-008",INVALID_INPUT_CHAR:"E-009",INPUT_STATE_NOT_FOUND:"E-010",INVALID_TRANSITION_OBJECT:"E-011",DUPLICATE_TRANSITION_OBJECT:"E-012",INVALID_STATE_ARRAY:"E-013"});var m=class{constructor(t){if(this.name=t,!this.name)throw new Error(p.INVALID_STATE_NAME)}};var P=o=>o.reduce((t,r)=>Object.assign(t,{[r]:(t[r]||0)+1}),{}),k=o=>Object.keys(o).filter(t=>o[t]>1);var j=o=>{let t=new Set;for(let r of o){if(t.has(r.name))return!0;t.add(r.name)}return!1},u=(o,t,r)=>{let i=o.get(t);return i??r},D=(o,t)=>t instanceof o||!!o.name&&o.name===t.constructor.name,J=(o,t)=>{for(let r of o)if(!t.has(r))return!1;return!0};var v=class{constructor(t){if(!Array.isArray(t))if(typeof t=="string")t=[...t];else throw new TypeError;if(this.sigma=t,k(P(this.sigma)).length>0)throw new Error(p.DUPLICATE_ALPHABET_VALS)}};var U=class{constructor(t,r,i){this.origin=t,this.dest=r,this.input=i}};var _=class{constructor(t,r,i){this.origin=t,this.dest=r,this.input=i}};var d=class{static validateTFunc(t,r,i,s){let e=new Set;for(let n of i){if(!t.has(n.origin))throw console.error("Origin state was invalid: %o",JSON.stringify(n.origin)),new Error(p.ORIGIN_STATE_NOT_FOUND);if(!t.has(n.dest))throw console.error("Dest state was invalid: %o",JSON.stringify(n.dest)),new Error(p.DEST_STATE_NOT_FOUND);let a=u(r,n.origin,new Set);if(this.isValidInputChar(n.input,s))if(r.has(n.origin)&&a.has(n.input))e.add(n),a.delete(n.input),a.size===0&&r.delete(n.origin);else throw new Error(p.DUPLICATE_TRANSITION_OBJECT);else throw new Error(p.INVALID_INPUT_CHAR)}if(r.size>0){console.error("Not all FSA paths have a transition specified:");for(let[n,a]of r)console.error("State %s on input(s): %s",n.name,[...a].join(" "));throw new Error(p.MISSING_REQUIRED_TRANSITION)}return e}static createPaths(t,r){let i=new Map;for(let s of t)for(let e of r.sigma){let n=u(i,s,new Set);i.has(s)?n.add(e):i.set(s,new Set([e]))}return i}static determineStateOrder(t,r,i,s,e){let n=[];t=new Map;for(let c of r){let l=u(t,c.origin.name,new Set);t.has(c.origin.name)?l.add(c.dest.name):t.set(c.origin.name,new Set([c.dest.name]))}this.parseLinks(n,s.name,t);let a=[];Object.values([...i]).map(c=>a.push(c.name));let S=a.filter(c=>!n.includes(c));return S.length>0&&(console.warn("Dead states detected, removing them and associated transitions: %O",S),this.removeDeadStates(S,i,e,r)),n}static removeDeadStates(t,r,i,s){for(let e of r)t.indexOf(e.name)!==-1&&r.delete(e);for(let e of i)t.indexOf(e.name)!==-1&&i.delete(e);for(let e of s)(t.indexOf(e.origin.name)!==-1||t.indexOf(e.dest.name)!==-1)&&s.delete(e)}static parseLinks(t,r,i){t.push(r);let s=u(i,r,new Set);for(let e of s)t.indexOf(e)===-1&&this.parseLinks(t,e,i)}static isValidInputChar(t,r){return t===""?!1:r.sigma.indexOf(t)!==-1}},B=(o,t,r,i,s)=>{let e=new Set;for(let n of r){if(!n.from||!n.to||!n.input)throw new Error(p.INVALID_TRANSITION_OBJECT);let a=u(o,n.from,null),S=u(o,n.to,null);e.add(new _(a,S,n.input))}return new g(new Set(o.values()),t,e,i,s)};var b=class extends d{static isValidInputChar(t,r){return r.sigma.indexOf(t)!==-1||t===""}static populateEpsilons(t,r){let i=!0;for(;i;){i=!1;let s=Array.from(t).filter(e=>r.includes(e.origin)&&e.input==="");for(let e of s)r.includes(e.dest)||(r.push(e.dest),i=!0)}return r}static validateTFunc(t,r,i,s){let e=new Set;for(let n of i){let a=!1;if(!t.has(n.origin))throw console.error("Origin state was invalid: %o",JSON.stringify(n.origin)),new Error(p.ORIGIN_STATE_NOT_FOUND);if(!t.has(n.dest))throw console.error("Dest state was invalid: %o",JSON.stringify(n.dest)),new Error(p.DEST_STATE_NOT_FOUND);for(let S of e)S.origin===n.origin&&S.dest===n.dest&&S.input===n.input&&(a=!0);if(!a&&r.has(n.origin))if(this.isValidInputChar(n.input,s))e.add(n);else throw new Error(p.INVALID_INPUT_CHAR)}return e}},H=(o,t,r,i,s)=>{let e=new Set;for(let n of r){if(!n.from||!n.to||!n.input&&n.input!=="")throw new Error(p.INVALID_TRANSITION_OBJECT);let a=u(o,n.from,null),S=n.to.split(","),c=[];S.forEach(l=>{c.push(u(o,l,null))}),e.add(new U(a,c,n.input))}return new T(new Set(o.values()),t,e,i,s)};var I=(()=>{function o(s,e,n){if(s.getAlphabet().sigma.indexOf(e)===-1)throw new Error(p.INVALID_INPUT_CHAR);if(!s.getStates().has(n))throw new Error(p.INPUT_STATE_NOT_FOUND);let a=Array.from(s.getTFunc()).find(S=>S.origin===n&&S.input===e);if(a)return a.dest;throw new Error(p.INVALID_TRANSITION_OBJECT)}function t(s,e,n){let a=[];if(s.getAlphabet().sigma.indexOf(e)===-1)throw new Error(p.INVALID_INPUT_CHAR);if(n=r(s.getTFunc(),n),e==="")return new Set(n);for(let l of n){let $=Array.from(s.getTFunc()).filter(V=>V.origin===l&&V.input===e);a=a.concat($)}let S=[];if(a.length>1)for(let l of a)S.push(l.dest);else if(a.length===1)S.push(a[0].dest);else return new Set;return new Set(r(s.getTFunc(),S))}function r(s,e){return b.populateEpsilons(s,e)}class i{constructor(e){this._type=e}receiveInput(e,n,a){if(D(T,e))return a instanceof m?t(e,n,[a]):t(e,n,a);if(Array.isArray(a)){if(a.length>1)throw console.error("State array can only contain one state for DFAs"),new Error(p.INVALID_STATE_ARRAY);a=a[0]}return o(e,n,a)}validateTFunc(e,n,a,S){return this._type===T?b.validateTFunc(e,n,a,S):d.validateTFunc(e,n,a,S)}createPaths(e,n){return d.createPaths(e,n)}determineStateOrder(e,n,a,S,c){return d.determineStateOrder(e,n,a,S,c)}}return i})(),z=(o,t,r,i,s)=>{let e=new Map;if(typeof o=="string")e.set(o,new m(o));else if(Array.isArray(o))for(let l of o)e.has(l)||e.set(l,new m(l));else throw new TypeError(String(o));let n=new v(t);if(typeof i!="string")throw new TypeError(String(i));let a=u(e,i,null),S=new Set;if(typeof s=="string")e.has(s)&&S.add(u(e,s,null));else if(Array.isArray(s))for(let l of s)S.add(u(e,l,null));else throw new TypeError(String(s));let c;if(!Array.isArray(r)&&typeof r=="object")c=[r];else if(Array.isArray(r))c=r;else throw new TypeError(String(r));for(let l of c)if(l.to.indexOf(",")!=-1||l.input==="")return H(e,n,c,a,S);return B(e,n,c,a,S)};var y,w,E,N,O,x,R,F,g=class{constructor(t,r,i,s,e){A(this,y);A(this,w);A(this,E);A(this,N);A(this,O);A(this,x);A(this,R,new Map);A(this,F);if(h(this,F,new I(this.constructor)),j(t))throw new Error(p.DUPLICATE_STATE_NAMES);if(h(this,y,t),h(this,w,r),h(this,x,f(this,F).createPaths(f(this,y),f(this,w))),!t.has(s))throw new Error(p.START_STATE_NOT_FOUND);if(h(this,N,s),Object.keys(e).length===0&&e.constructor===Object&&(e=new Set([])),!J(e,t))throw new Error(p.ACCEPTS_NOT_SUBSET);h(this,O,e),h(this,E,f(this,F).validateTFunc(f(this,y),f(this,x),i,f(this,w)))}getStates(){return f(this,y)}getAlphabet(){return f(this,w)}getTFunc(){return f(this,E)}getStartState(){return f(this,N)}getAcceptStates(){return f(this,O)}getType(){return"DFA"}generateDigraph(){let t=[];for(let i of f(this,O))t.push(i.name);let r=new Map;return Object.values([...f(this,E)]).map(function(i){let s=i.origin.name+i.dest.name,e=i.input;if(e===""&&(e="\u03B5"),!r.has(s))r.set(s,i.origin.name+" -> "+i.dest.name+' [ label = "'+e+'" ];');else{let n=u(r,s,""),a=n.split('"')[1],S=a.split(",");S.push(e),S.sort(),n=n.replace('"'+a+'"','"'+S.toString()+'"'),r.set(s,n)}}),`digraph fsa {
2
- ${Object.values(f(this,F).determineStateOrder(f(this,R),f(this,E),f(this,y),f(this,N),f(this,O))).map(function(i){return t.indexOf(i)!==-1?i+" [shape = doublecircle];":i}).join(`
1
+ "use strict";var fasJs=(()=>{var C=Object.defineProperty;var Q=Object.getOwnPropertyDescriptor;var Y=Object.getOwnPropertyNames;var W=Object.prototype.hasOwnProperty;var L=o=>{throw TypeError(o)};var X=(o,t)=>{for(var e in t)C(o,e,{get:t[e],enumerable:!0})},Z=(o,t,e,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of Y(t))!W.call(o,s)&&s!==e&&C(o,s,{get:()=>t[s],enumerable:!(i=Q(t,s))||i.enumerable});return o};var q=o=>Z(C({},"__esModule",{value:!0}),o);var M=(o,t,e)=>t.has(o)||L("Cannot "+e);var f=(o,t,e)=>(M(o,t,"read from private field"),e?e.call(o):t.get(o)),T=(o,t,e)=>t.has(o)?L("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(o):t.set(o,e),h=(o,t,e,i)=>(M(o,t,"write to private field"),i?i.call(o,e):t.set(o,e),e);var nt={};X(nt,{createFSA:()=>z,simulateFSA:()=>G,stepOnceFSA:()=>K});var S=Object.freeze({DUPLICATE_ALPHABET_VALS:"E-001",DUPLICATE_STATE_NAMES:"E-002",INVALID_STATE_NAME:"E-003",START_STATE_NOT_FOUND:"E-004",ACCEPTS_NOT_SUBSET:"E-005",ORIGIN_STATE_NOT_FOUND:"E-006",DEST_STATE_NOT_FOUND:"E-007",MISSING_REQUIRED_TRANSITION:"E-008",INVALID_INPUT_CHAR:"E-009",INPUT_STATE_NOT_FOUND:"E-010",INVALID_TRANSITION_OBJECT:"E-011",DUPLICATE_TRANSITION_OBJECT:"E-012",INVALID_STATE_ARRAY:"E-013"});var m=class{constructor(t){if(this.name=t,!this.name)throw new Error(S.INVALID_STATE_NAME)}};var P=o=>o.reduce((t,e)=>Object.assign(t,{[e]:(t[e]||0)+1}),{}),k=o=>Object.keys(o).filter(t=>o[t]>1);var J=o=>{let t=new Set;for(let e of o){if(t.has(e.name))return!0;t.add(e.name)}return!1},u=(o,t,e)=>{let i=o.get(t);return i??e},tt=o=>{try{let e=Object.getPrototypeOf(o)?.constructor;return typeof e=="function"&&typeof e.name=="string"&&e.name.length>0?e.name:void 0}catch{return}},I=(o,t)=>{if(t==null||typeof t!="object"&&typeof t!="function")return!1;try{if(t instanceof o)return!0}catch{return!1}let e;try{e=typeof o.name=="string"&&o.name.length>0?o.name:void 0}catch{return!1}return!!e&&e===tt(t)},j=(o,t)=>{for(let e of o)if(!t.has(e))return!1;return!0};var v=class{constructor(t){if(!Array.isArray(t))if(typeof t=="string")t=[...t];else throw new TypeError;if(this.sigma=t,k(P(this.sigma)).length>0)throw new Error(S.DUPLICATE_ALPHABET_VALS)}};var U=class{constructor(t,e,i){this.origin=t,this.dest=e,this.input=i}};var D=class{constructor(t,e,i){this.origin=t,this.dest=e,this.input=i}};var d=class{static validateTFunc(t,e,i,s){let r=new Set;for(let n of i){if(!t.has(n.origin))throw console.error("Origin state was invalid: %o",JSON.stringify(n.origin)),new Error(S.ORIGIN_STATE_NOT_FOUND);if(!t.has(n.dest))throw console.error("Dest state was invalid: %o",JSON.stringify(n.dest)),new Error(S.DEST_STATE_NOT_FOUND);let a=u(e,n.origin,new Set);if(this.isValidInputChar(n.input,s))if(e.has(n.origin)&&a.has(n.input))r.add(n),a.delete(n.input),a.size===0&&e.delete(n.origin);else throw new Error(S.DUPLICATE_TRANSITION_OBJECT);else throw new Error(S.INVALID_INPUT_CHAR)}if(e.size>0){console.error("Not all FSA paths have a transition specified:");for(let[n,a]of e)console.error("State %s on input(s): %s",n.name,[...a].join(" "));throw new Error(S.MISSING_REQUIRED_TRANSITION)}return r}static createPaths(t,e){let i=new Map;for(let s of t)for(let r of e.sigma){let n=u(i,s,new Set);i.has(s)?n.add(r):i.set(s,new Set([r]))}return i}static determineStateOrder(t,e,i,s,r){let n=[];t=new Map;for(let c of e){let l=u(t,c.origin.name,new Set);t.has(c.origin.name)?l.add(c.dest.name):t.set(c.origin.name,new Set([c.dest.name]))}this.parseLinks(n,s.name,t);let a=[];Object.values([...i]).map(c=>a.push(c.name));let p=a.filter(c=>!n.includes(c));return p.length>0&&(console.warn("Dead states detected, removing them and associated transitions: %O",p),this.removeDeadStates(p,i,r,e)),n}static removeDeadStates(t,e,i,s){for(let r of e)t.indexOf(r.name)!==-1&&e.delete(r);for(let r of i)t.indexOf(r.name)!==-1&&i.delete(r);for(let r of s)(t.indexOf(r.origin.name)!==-1||t.indexOf(r.dest.name)!==-1)&&s.delete(r)}static parseLinks(t,e,i){t.push(e);let s=u(i,e,new Set);for(let r of s)t.indexOf(r)===-1&&this.parseLinks(t,r,i)}static isValidInputChar(t,e){return t===""?!1:e.sigma.indexOf(t)!==-1}},B=(o,t,e,i,s)=>{let r=new Set;for(let n of e){if(!n.from||!n.to||!n.input)throw new Error(S.INVALID_TRANSITION_OBJECT);let a=u(o,n.from,null),p=u(o,n.to,null);r.add(new D(a,p,n.input))}return new g(new Set(o.values()),t,r,i,s)};var b=class extends d{static isValidInputChar(t,e){return e.sigma.indexOf(t)!==-1||t===""}static populateEpsilons(t,e){let i=!0;for(;i;){i=!1;let s=Array.from(t).filter(r=>e.includes(r.origin)&&r.input==="");for(let r of s)e.includes(r.dest)||(e.push(r.dest),i=!0)}return e}static validateTFunc(t,e,i,s){let r=new Set;for(let n of i){let a=!1;if(!t.has(n.origin))throw console.error("Origin state was invalid: %o",JSON.stringify(n.origin)),new Error(S.ORIGIN_STATE_NOT_FOUND);if(!t.has(n.dest))throw console.error("Dest state was invalid: %o",JSON.stringify(n.dest)),new Error(S.DEST_STATE_NOT_FOUND);for(let p of r)p.origin===n.origin&&p.dest===n.dest&&p.input===n.input&&(a=!0);if(!a&&e.has(n.origin))if(this.isValidInputChar(n.input,s))r.add(n);else throw new Error(S.INVALID_INPUT_CHAR)}return r}},H=(o,t,e,i,s)=>{let r=new Set;for(let n of e){if(!n.from||!n.to||!n.input&&n.input!=="")throw new Error(S.INVALID_TRANSITION_OBJECT);let a=u(o,n.from,null),p=n.to.split(","),c=[];p.forEach(l=>{c.push(u(o,l,null))}),r.add(new U(a,c,n.input))}return new A(new Set(o.values()),t,r,i,s)};var w=(()=>{function o(s,r,n){if(s.getAlphabet().sigma.indexOf(r)===-1)throw new Error(S.INVALID_INPUT_CHAR);if(!s.getStates().has(n))throw new Error(S.INPUT_STATE_NOT_FOUND);let a=Array.from(s.getTFunc()).find(p=>p.origin===n&&p.input===r);if(a)return a.dest;throw new Error(S.INVALID_TRANSITION_OBJECT)}function t(s,r,n){let a=[];if(s.getAlphabet().sigma.indexOf(r)===-1)throw new Error(S.INVALID_INPUT_CHAR);if(n=e(s.getTFunc(),n),r==="")return new Set(n);for(let l of n){let $=Array.from(s.getTFunc()).filter(V=>V.origin===l&&V.input===r);a=a.concat($)}let p=[];if(a.length>1)for(let l of a)p.push(l.dest);else if(a.length===1)p.push(a[0].dest);else return new Set;return new Set(e(s.getTFunc(),p))}function e(s,r){return b.populateEpsilons(s,r)}class i{constructor(r){this._type=r}receiveInput(r,n,a){if(I(A,r))return I(m,a)?t(r,n,[a]):t(r,n,a);if(Array.isArray(a)){if(a.length>1)throw console.error("State array can only contain one state for DFAs"),new Error(S.INVALID_STATE_ARRAY);a=a[0]}return o(r,n,a)}validateTFunc(r,n,a,p){return this._type===A?b.validateTFunc(r,n,a,p):d.validateTFunc(r,n,a,p)}createPaths(r,n){return d.createPaths(r,n)}determineStateOrder(r,n,a,p,c){return d.determineStateOrder(r,n,a,p,c)}}return i})(),z=(o,t,e,i,s)=>{let r=new Map;if(typeof o=="string")r.set(o,new m(o));else if(Array.isArray(o))for(let l of o)r.has(l)||r.set(l,new m(l));else throw new TypeError(String(o));let n=new v(t);if(typeof i!="string")throw new TypeError(String(i));let a=u(r,i,null),p=new Set;if(typeof s=="string")r.has(s)&&p.add(u(r,s,null));else if(Array.isArray(s))for(let l of s)p.add(u(r,l,null));else throw new TypeError(String(s));let c;if(!Array.isArray(e)&&typeof e=="object")c=[e];else if(Array.isArray(e))c=e;else throw new TypeError(String(e));for(let l of c)if(l.to.indexOf(",")!=-1||l.input==="")return H(r,n,c,a,p);return B(r,n,c,a,p)};var y,E,N,O,F,x,R,_,g=class{constructor(t,e,i,s,r){T(this,y);T(this,E);T(this,N);T(this,O);T(this,F);T(this,x);T(this,R,new Map);T(this,_);if(h(this,_,new w(this.constructor)),J(t))throw new Error(S.DUPLICATE_STATE_NAMES);if(h(this,y,t),h(this,E,e),h(this,x,f(this,_).createPaths(f(this,y),f(this,E))),!t.has(s))throw new Error(S.START_STATE_NOT_FOUND);if(h(this,O,s),Object.keys(r).length===0&&r.constructor===Object&&(r=new Set([])),!j(r,t))throw new Error(S.ACCEPTS_NOT_SUBSET);h(this,F,r),h(this,N,f(this,_).validateTFunc(f(this,y),f(this,x),i,f(this,E)))}getStates(){return f(this,y)}getAlphabet(){return f(this,E)}getTFunc(){return f(this,N)}getStartState(){return f(this,O)}getAcceptStates(){return f(this,F)}getType(){return"DFA"}generateDigraph(){let t=[];for(let i of f(this,F))t.push(i.name);let e=new Map;return Object.values([...f(this,N)]).map(function(i){let s=i.origin.name+i.dest.name,r=i.input;if(r===""&&(r="\u03B5"),!e.has(s))e.set(s,i.origin.name+" -> "+i.dest.name+' [ label = "'+r+'" ];');else{let n=u(e,s,""),a=n.split('"')[1],p=a.split(",");p.push(r),p.sort(),n=n.replace('"'+a+'"','"'+p.toString()+'"'),e.set(s,n)}}),`digraph fsa {
2
+ ${Object.values(f(this,_).determineStateOrder(f(this,R),f(this,N),f(this,y),f(this,O),f(this,F))).map(function(i){return t.indexOf(i)!==-1?i+" [shape = doublecircle];":i}).join(`
3
3
  `)}
4
4
  rankdir=LR;
5
5
  node [shape = point ]; qi;
6
6
  node [shape = circle];
7
- qi -> ${f(this,N).name};
8
- ${Object.values([...r]).map(function([,i]){return i}).join(`
7
+ qi -> ${f(this,O).name};
8
+ ${Object.values([...e]).map(function([,i]){return i}).join(`
9
9
  `)}
10
10
  }
11
- `}};y=new WeakMap,w=new WeakMap,E=new WeakMap,N=new WeakMap,O=new WeakMap,x=new WeakMap,R=new WeakMap,F=new WeakMap;var T=class extends g{constructor(t,r,i,s,e){r.sigma.includes("")||r.sigma.push("");let n=new Set;for(let a of i)a.dest.forEach(S=>{n.add(new _(a.origin,S,a.input))});super(t,r,n,s,e)}getType(){return"NFA"}};var G=(o,t,r=!1,i=!1)=>D(T,t)?et(o,t,new I(T),r,i):tt(o,t,new I(g),r,i),K=(o,t,r,i=!1)=>{if(typeof o!="string")throw i&&console.error("Input w was invalid type: %O",o),new TypeError;if(typeof t!="string"&&!Array.isArray(t))throw i&&console.error("Input state was invalid type: %O",t),new TypeError;i&&console.log("Input Processing Started");let s=[];if(typeof t=="string"){for(let n of r.getStates().values())t===n.name&&(s=n);if(!s||Array.isArray(s)&&s.length===0)throw new Error(p.INVALID_STATE_NAME)}else{s=[];for(let n of r.getStates().values())t.includes(n.name)&&s.push(n);if(s.length!==t.length)throw new Error(p.INVALID_STATE_NAME)}let e;if(D(T,r)?e=[...new I(T).receiveInput(r,o,s)]:e=new I(g).receiveInput(r,o,s),i&&console.log("%o x '%s' -> %o",JSON.stringify(s),o,JSON.stringify(e)),i&&console.log("Input Processing Ended"),e instanceof m)return e.name;{let n=[];for(let a of e)n.push(a.name);return n}};function tt(o,t,r,i,s){if(i&&console.log("Beginning DFA Simulation"),!Array.isArray(o))if(typeof o=="string")o=[...o];else throw i&&console.error("Input w was invalid type: %O",o),new TypeError;i&&console.log("Input Processing Started");let e=t.getStartState();for(let n of o){let a=e;e=r.receiveInput(t,n,a),i&&console.log("%o x '%s' -> %o",JSON.stringify(a),n,JSON.stringify(e))}return i&&console.log("Input Processing Ended"),t.getAcceptStates().has(e)?(i&&console.log("Input Accepted!"),s?e.name:!0):(i&&console.log("Input Rejected!"),s?e.name:!1)}function et(o,t,r,i,s){if(i&&console.log("Beginning NFA Simulation"),!(o instanceof Array))if(typeof o=="string")o===""?o=[""]:o=[...o];else throw i&&console.error("Input w was invalid type: %O",o),new TypeError;i&&console.log("Input Processing Started");let e=[t.getStartState()];for(let a of o){let S=e;e=[...r.receiveInput(t,a,e)],i&&console.log("%o x '%s' -> %o",JSON.stringify(S),a,JSON.stringify(e))}i&&console.log("Input Processing Ended");let n=[];for(let a of t.getAcceptStates())if(e.includes(a)){if(!s)return i&&console.log("Input Accepted!"),!0;n.push(a.name)}if(n.length>0)return i&&console.log("Input Accepted!"),n;if(i&&console.log("Input Rejected!"),s){if(e.length>0)for(let a of e)n.push(a.name);return n}else return!1}return q(rt);})();
11
+ `}};y=new WeakMap,E=new WeakMap,N=new WeakMap,O=new WeakMap,F=new WeakMap,x=new WeakMap,R=new WeakMap,_=new WeakMap;var A=class extends g{constructor(t,e,i,s,r){e.sigma.includes("")||e.sigma.push("");let n=new Set;for(let a of i)a.dest.forEach(p=>{n.add(new D(a.origin,p,a.input))});super(t,e,n,s,r)}getType(){return"NFA"}};var G=(o,t,e=!1,i=!1)=>I(A,t)?rt(o,t,new w(A),e,i):et(o,t,new w(g),e,i),K=(o,t,e,i=!1)=>{if(typeof o!="string")throw i&&console.error("Input w was invalid type: %O",o),new TypeError;if(typeof t!="string"&&!Array.isArray(t))throw i&&console.error("Input state was invalid type: %O",t),new TypeError;i&&console.log("Input Processing Started");let s=[];if(typeof t=="string"){for(let n of e.getStates().values())t===n.name&&(s=n);if(!s||Array.isArray(s)&&s.length===0)throw new Error(S.INVALID_STATE_NAME)}else{s=[];for(let n of e.getStates().values())t.includes(n.name)&&s.push(n);if(s.length!==t.length)throw new Error(S.INVALID_STATE_NAME)}let r;if(I(A,e)?r=[...new w(A).receiveInput(e,o,s)]:r=new w(g).receiveInput(e,o,s),i&&console.log("%o x '%s' -> %o",JSON.stringify(s),o,JSON.stringify(r)),i&&console.log("Input Processing Ended"),I(m,r))return r.name;{let n=[];for(let a of r)n.push(a.name);return n}};function et(o,t,e,i,s){if(i&&console.log("Beginning DFA Simulation"),!Array.isArray(o))if(typeof o=="string")o=[...o];else throw i&&console.error("Input w was invalid type: %O",o),new TypeError;i&&console.log("Input Processing Started");let r=t.getStartState();for(let n of o){let a=r;r=e.receiveInput(t,n,a),i&&console.log("%o x '%s' -> %o",JSON.stringify(a),n,JSON.stringify(r))}return i&&console.log("Input Processing Ended"),t.getAcceptStates().has(r)?(i&&console.log("Input Accepted!"),s?r.name:!0):(i&&console.log("Input Rejected!"),s?r.name:!1)}function rt(o,t,e,i,s){if(i&&console.log("Beginning NFA Simulation"),!Array.isArray(o))if(typeof o=="string")o===""?o=[""]:o=[...o];else throw i&&console.error("Input w was invalid type: %O",o),new TypeError;i&&console.log("Input Processing Started");let r=[t.getStartState()];for(let a of o){let p=r;r=[...e.receiveInput(t,a,r)],i&&console.log("%o x '%s' -> %o",JSON.stringify(p),a,JSON.stringify(r))}i&&console.log("Input Processing Ended");let n=[];for(let a of t.getAcceptStates())if(r.includes(a)){if(!s)return i&&console.log("Input Accepted!"),!0;n.push(a.name)}if(n.length>0)return i&&console.log("Input Accepted!"),n;if(i&&console.log("Input Rejected!"),s){if(r.length>0)for(let a of r)n.push(a.name);return n}else return!1}return q(nt);})();
12
12
  //# sourceMappingURL=bundle.global.js.map
package/lib/bundle.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/modules.ts","../src/globals/errors.ts","../src/components/State.ts","../src/globals/globals.ts","../src/components/Alphabet.ts","../src/components/NFATransition.ts","../src/components/Transition.ts","../src/utils/DFAUtils.ts","../src/utils/NFAUtils.ts","../src/utils/FSAUtils.ts","../src/automata/DFA.ts","../src/automata/NFA.ts","../src/engine/Simulators.ts"],"sourcesContent":["export { simulateFSA, stepOnceFSA } from \"./engine/Simulators\";\nexport { createFSA } from \"./utils/FSAUtils\";\nexport type { TransitionInput } from \"./utils/DFAUtils\";","export const ErrorCode: Readonly<Record<string, string>> = Object.freeze({\n DUPLICATE_ALPHABET_VALS: \"E-001\",\n DUPLICATE_STATE_NAMES: \"E-002\",\n INVALID_STATE_NAME: \"E-003\",\n START_STATE_NOT_FOUND: \"E-004\",\n ACCEPTS_NOT_SUBSET: \"E-005\",\n ORIGIN_STATE_NOT_FOUND: \"E-006\",\n DEST_STATE_NOT_FOUND: \"E-007\",\n MISSING_REQUIRED_TRANSITION: \"E-008\",\n INVALID_INPUT_CHAR: \"E-009\",\n INPUT_STATE_NOT_FOUND: \"E-010\",\n INVALID_TRANSITION_OBJECT: \"E-011\",\n DUPLICATE_TRANSITION_OBJECT: \"E-012\",\n INVALID_STATE_ARRAY: \"E-013\"\n});","import { ErrorCode } from \"../globals/errors\";\n\nexport class State {\n name: string;\n\n constructor(name: string) {\n this.name = name;\n if (!this.name) throw new Error(ErrorCode.INVALID_STATE_NAME);\n }\n}","import { type State } from \"../components/State\";\n\n// Count number of instances for each string in an array - returns key/val pairs\nexport const count = (names: string[]): Record<string, number> =>\n names.reduce((a, b) => Object.assign(a, { [b]: (a[b] || 0) + 1 }), {} as Record<string, number>);\n\n// Returns keys with value > 1\nexport const duplicates = (dict: Record<string, number>): string[] =>\n Object.keys(dict).filter(a => dict[a] > 1);\n\n// Equality function for Arrays containing primitive typed values\nexport const compare = (\n a1: Array<string | number | boolean>,\n a2: Array<string | number | boolean>\n): boolean => {\n const s1 = new Set(a1);\n const s2 = new Set(a2);\n return s1.size === s2.size && [...s1].every(v => s2.has(v));\n};\n\n// Check for duplicate keys in a Set<State> input\nexport const checkStateDuplicates = (states: Set<State>): boolean => {\n const check: Set<string> = new Set();\n for (const item of states) {\n if (check.has(item.name)) return true;\n check.add(item.name);\n }\n return false;\n};\n\nexport const getOrDefault = <K, V>(map: Map<K, V>, key: K, defaultValue: V): V => {\n const val = map.get(key);\n return val == null ? defaultValue : val;\n};\n\ntype ConstructorLike<T extends object = object> = abstract new (...args: never[]) => T;\n\nexport const instanceOf = <T extends object>(ctor: ConstructorLike<T>, obj: object): obj is T => {\n return obj instanceof ctor || (Boolean(ctor.name) && ctor.name === obj.constructor.name);\n};\n\nexport const isSubsetOf = <T>(subset: Set<T>, superset: Set<T>): boolean => {\n for (const item of subset) {\n if (!superset.has(item)) return false;\n }\n return true;\n};\n\nexport const isSupersetOf = <T>(superset: Set<T>, subset: Set<T>): boolean => {\n return isSubsetOf(subset, superset);\n};","import { ErrorCode } from \"../globals/errors\";\nimport { count, duplicates } from \"../globals/globals\";\n\nexport class Alphabet {\n sigma: string[];\n\n constructor(sigma: string | string[]) {\n if (!Array.isArray(sigma)) {\n if (typeof sigma === \"string\") sigma = [...sigma];\n else throw new TypeError();\n }\n this.sigma = sigma;\n if (duplicates(count(this.sigma)).length > 0) throw new Error(ErrorCode.DUPLICATE_ALPHABET_VALS);\n }\n}","import { type State } from \"./State\";\n\nexport class NFATransition {\n origin: State;\n dest: State[];\n input: string;\n\n constructor(origin: State, dest: State[], input: string) {\n this.origin = origin;\n this.dest = dest;\n this.input = input;\n }\n}","import { type State } from \"./State\";\n\nexport class Transition {\n origin: State;\n dest: State;\n input: string;\n\n constructor(origin: State, dest: State, input: string) {\n this.origin = origin;\n this.dest = dest;\n this.input = input;\n }\n}","import { ErrorCode } from \"../globals/errors\";\nimport { type State, type Alphabet, Transition } from \"../components\";\nimport { DFA } from \"../automata\";\nimport { getOrDefault } from \"../globals/globals\";\n\nexport class DFAUtils {\n /*\n * Transition function should only contain states in Q, and one transition should exist\n * for each combination of Q x Σ\n */\n static validateTFunc(\n _states: Set<State>,\n _paths: Map<State, Set<string>>,\n _tfunc: Set<Transition>,\n _alph: Alphabet\n ): Set<Transition> {\n const newTFunc: Set<Transition> = new Set(); // Will contain only necessary transitions\n\n for (const _t of _tfunc) {\n // Check for valid states\n if (!_states.has(_t.origin)) {\n console.error(\"Origin state was invalid: %o\", JSON.stringify(_t.origin));\n throw new Error(ErrorCode.ORIGIN_STATE_NOT_FOUND);\n }\n if (!_states.has(_t.dest)) {\n console.error(\"Dest state was invalid: %o\", JSON.stringify(_t.dest));\n throw new Error(ErrorCode.DEST_STATE_NOT_FOUND);\n }\n\n const pathStateVals: Set<string> = getOrDefault(_paths, _t.origin, new Set());\n\n // Map transition to a path and remove on match\n if (this.isValidInputChar(_t.input, _alph)) {\n if (_paths.has(_t.origin) && pathStateVals.has(_t.input)) {\n newTFunc.add(_t);\n pathStateVals.delete(_t.input);\n if (pathStateVals.size === 0) {\n _paths.delete(_t.origin);\n }\n } else {\n throw new Error(ErrorCode.DUPLICATE_TRANSITION_OBJECT);\n }\n } else {\n throw new Error(ErrorCode.INVALID_INPUT_CHAR);\n }\n }\n\n if (_paths.size > 0) {\n console.error(\"Not all FSA paths have a transition specified:\");\n for (const [key, val] of _paths) {\n console.error(\"State %s on input(s): %s\", key.name, [...val].join(\" \"));\n }\n throw new Error(ErrorCode.MISSING_REQUIRED_TRANSITION);\n }\n\n return newTFunc;\n }\n\n static createPaths(_states: Set<State>, _alph: Alphabet): Map<State, Set<string>> {\n const _paths: Map<State, Set<string>> = new Map<State, Set<string>>();\n for (const state of _states) {\n for (const char of _alph.sigma) {\n const pathStateVals: Set<string> = getOrDefault(_paths, state, new Set());\n if (_paths.has(state)) pathStateVals.add(char);\n else _paths.set(state, new Set([char]));\n }\n }\n\n return _paths;\n }\n\n // Determine digraph order based on start state, then following the chain\n static determineStateOrder(\n _links: Map<string, Set<string>>,\n _tfunc: Set<Transition>,\n _states: Set<State>,\n _start: State,\n _accepts: Set<State>\n ): string[] {\n const statesOrder: string[] = []; // Ordered state names for digraph\n\n // Map origin state names to dest state names\n _links = new Map();\n for (const tr of _tfunc) {\n const linkStateVals: Set<string> = getOrDefault(_links, tr.origin.name, new Set());\n if (_links.has(tr.origin.name)) linkStateVals.add(tr.dest.name);\n else _links.set(tr.origin.name, new Set([tr.dest.name]));\n }\n\n // Populate state order\n this.parseLinks(statesOrder, _start.name, _links);\n\n // Check for dead states and reduce FSA if necessary\n const stateArr: string[] = [];\n (Object.values([..._states]) as State[]).map((state: State) => stateArr.push(state.name));\n const deadStates = stateArr.filter(x => !statesOrder.includes(x));\n if (deadStates.length > 0) {\n console.warn(\"Dead states detected, removing them and associated transitions: %O\", deadStates);\n this.removeDeadStates(deadStates, _states, _accepts, _tfunc);\n }\n\n return statesOrder;\n }\n\n // Reduce FSA by removing dead states and associated transitions\n static removeDeadStates(\n deadStates: string[],\n _states: Set<State>,\n _accepts: Set<State>,\n _tfunc: Set<Transition>\n ) {\n // Q\n for (const state of _states) {\n if (deadStates.indexOf(state.name) !== -1) _states.delete(state);\n }\n // F\n for (const state of _accepts) {\n if (deadStates.indexOf(state.name) !== -1) _accepts.delete(state);\n }\n // δ\n for (const tr of _tfunc) {\n if (deadStates.indexOf(tr.origin.name) !== -1 || deadStates.indexOf(tr.dest.name) !== -1) _tfunc.delete(tr);\n }\n }\n\n // Recursively parse graph while adding to an array in order, beginning with q0\n static parseLinks(arr: string[], name: string, _links: Map<string, Set<string>>) {\n arr.push(name);\n const nameVal = getOrDefault(_links, name, new Set<string>());\n for (const st of nameVal) {\n if (arr.indexOf(st) === -1) this.parseLinks(arr, st, _links);\n }\n }\n\n // DFA does not allow empty symbol\n static isValidInputChar(input: string, _alph: Alphabet): boolean {\n if (input === \"\") return false;\n return _alph.sigma.indexOf(input) !== -1;\n }\n}\n\nexport interface TransitionInput {\n from: string;\n to: string;\n input: string;\n}\n\n// Global export method for creating DFA\nexport const createDFA = (\n states: Map<string, State>,\n alphabet: Alphabet,\n transitions: TransitionInput[],\n start: State,\n accepts: Set<State>\n): InstanceType<typeof DFA> => {\n // Convert transition array to Set<Transition>\n const _tfunc: Set<Transition> = new Set();\n for (const tr of transitions) {\n if (!tr.from || !tr.to || !tr.input) throw new Error(ErrorCode.INVALID_TRANSITION_OBJECT);\n const fromVal: State = getOrDefault(states, tr.from, null as unknown as State);\n const toVal: State = getOrDefault(states, tr.to, null as unknown as State);\n _tfunc.add(new Transition(fromVal, toVal, tr.input));\n }\n return new DFA(new Set(states.values()), alphabet, _tfunc, start, accepts);\n};","import { DFAUtils } from \"./DFAUtils\";\nimport { NFA } from \"../automata\";\nimport { type State, type Transition, type Alphabet, NFATransition } from \"../components\";\nimport { ErrorCode } from \"../globals/errors\";\nimport { getOrDefault } from \"../globals/globals\";\nimport type { TransitionInput } from \"./DFAUtils\";\n\nexport class NFAUtils extends DFAUtils {\n // NFA inheritly allows for ε (empty string) transition if specified\n static isValidInputChar(input: string, _alph: Alphabet): boolean {\n return _alph.sigma.indexOf(input) !== -1 || input === \"\";\n }\n\n // Follow all ε transitions and add to `state` (origin states)\n static populateEpsilons(_tfunc: Set<Transition>, state: State[]): State[] {\n let cont = true; // continue\n while (cont) {\n cont = false;\n\n // Find all ε from origin set\n const epsTransitions: Transition[] = Array.from(_tfunc).filter(obj => {\n return state.includes(obj.origin) && obj.input === \"\";\n });\n\n // Add new states, break if no new states found\n for (const _t of epsTransitions) {\n if (!state.includes(_t.dest)) {\n state.push(_t.dest);\n cont = true;\n }\n }\n }\n return state;\n }\n\n // Validate tfunc according to NFA rules\n static validateTFunc(\n _states: Set<State>,\n _paths: Map<State, Set<string>>,\n _tfunc: Set<Transition>,\n _alph: Alphabet\n ): Set<Transition> {\n const newTFunc: Set<Transition> = new Set(); // Will contain only necessary transitions\n\n for (const _t of _tfunc) {\n let skip = false;\n\n // Check for valid states\n if (!_states.has(_t.origin)) {\n console.error(\"Origin state was invalid: %o\", JSON.stringify(_t.origin));\n throw new Error(ErrorCode.ORIGIN_STATE_NOT_FOUND);\n }\n if (!_states.has(_t.dest)) {\n console.error(\"Dest state was invalid: %o\", JSON.stringify(_t.dest));\n throw new Error(ErrorCode.DEST_STATE_NOT_FOUND);\n }\n\n // Check for duplicate before adding\n for (const _checkT of newTFunc) {\n if (_checkT.origin === _t.origin && _checkT.dest === _t.dest && _checkT.input === _t.input) skip = true;\n }\n\n // Map transition to a path and remove on match\n if (!skip) {\n if (_paths.has(_t.origin)) {\n if (this.isValidInputChar(_t.input, _alph)) {\n newTFunc.add(_t);\n } else {\n throw new Error(ErrorCode.INVALID_INPUT_CHAR);\n }\n }\n }\n }\n\n return newTFunc;\n }\n}\n\nexport const createNFA = (\n states: Map<string, State>,\n alphabet: Alphabet,\n transitions: TransitionInput[],\n start: State,\n accepts: Set<State>\n): InstanceType<typeof NFA> => {\n // Convert transition array to Set<NFATransition>\n const _tfunc: Set<NFATransition> = new Set();\n for (const tr of transitions) {\n if (!tr.from || !tr.to || (!tr.input && tr.input !== \"\"))\n throw new Error(ErrorCode.INVALID_TRANSITION_OBJECT);\n const fromVal: State = getOrDefault(states, tr.from, null as unknown as State);\n const toVal: string[] = tr.to.split(\",\");\n\n const destStates: State[] = [];\n toVal.forEach(_dest => {\n destStates.push(getOrDefault(states, _dest, null as unknown as State));\n });\n\n _tfunc.add(new NFATransition(fromVal, destStates, tr.input));\n }\n return new NFA(new Set(states.values()), alphabet, _tfunc, start, accepts);\n};","import { ErrorCode } from \"../globals/errors\";\nimport { instanceOf, getOrDefault } from \"../globals/globals\";\nimport { type FSA } from \"../interfaces/FSA\";\nimport { State, type Transition, Alphabet } from \"../components\";\nimport { type DFA, NFA } from \"../automata\";\nimport { DFAUtils, createDFA, type TransitionInput } from \"./DFAUtils\";\nimport { NFAUtils, createNFA } from \"./NFAUtils\";\n\nexport type { TransitionInput };\n\n/*\n * This class will take an input FSA constructor function\n * to determine which util methods need to be called\n */\nexport const FSAUtils = (() => {\n /*\n * Private methods\n */\n function receiveInputDFA(dfa: InstanceType<typeof DFA>, input: string, state: State): State {\n if (dfa.getAlphabet().sigma.indexOf(input) === -1) throw new Error(ErrorCode.INVALID_INPUT_CHAR);\n if (!dfa.getStates().has(state)) throw new Error(ErrorCode.INPUT_STATE_NOT_FOUND);\n\n const path = Array.from(dfa.getTFunc()).find(obj => {\n return obj.origin === state && obj.input === input;\n });\n\n if (path) return path.dest;\n else throw new Error(ErrorCode.INVALID_TRANSITION_OBJECT);\n }\n\n function receiveInputNFA(nfa: InstanceType<typeof NFA>, input: string, state: State[]): Set<State> {\n let path: Transition[] = [];\n if (nfa.getAlphabet().sigma.indexOf(input) === -1) throw new Error(ErrorCode.INVALID_INPUT_CHAR);\n\n // Empty transitions\n state = populateEpsilons(nfa.getTFunc(), state);\n\n // For ε input, return states already determined\n if (input === \"\") return new Set<State>(state);\n\n // Looking at all origin states, based on input char, determine set of destination states\n for (const _s of state) {\n const _addToPath: Transition[] = Array.from(nfa.getTFunc()).filter(obj => {\n return obj.origin === _s && obj.input === input;\n });\n\n path = path.concat(_addToPath);\n }\n\n const resultArr: State[] = [];\n if (path.length > 1) {\n for (const _s of path) resultArr.push(_s.dest);\n } else if (path.length === 1) {\n resultArr.push(path[0].dest);\n } else {\n // No valid transition found, returning empty set\n return new Set<State>();\n }\n\n // Empty transitions on result set\n const retSet: Set<State> = new Set<State>(populateEpsilons(nfa.getTFunc(), resultArr));\n\n return retSet;\n }\n\n function populateEpsilons(_tfunc: Set<Transition>, state: State[]): State[] {\n return NFAUtils.populateEpsilons(_tfunc, state);\n }\n\n class FSAUtils {\n _type: typeof DFA | typeof NFA;\n\n constructor(v: typeof DFA | typeof NFA) {\n this._type = v;\n }\n\n receiveInput(fsa: FSA, input: string, state: State | State[]): State | Set<State> {\n if (instanceOf(NFA, fsa)) {\n if (state instanceof State) return receiveInputNFA(fsa as InstanceType<typeof NFA>, input, [state]);\n else return receiveInputNFA(fsa as InstanceType<typeof NFA>, input, state);\n } else {\n if (Array.isArray(state)) {\n if (state.length > 1) {\n console.error(\"State array can only contain one state for DFAs\");\n throw new Error(ErrorCode.INVALID_STATE_ARRAY);\n } else {\n state = state[0];\n }\n }\n return receiveInputDFA(fsa as InstanceType<typeof DFA>, input, state);\n }\n }\n\n validateTFunc(\n _states: Set<State>,\n _paths: Map<State, Set<string>>,\n _tfunc: Set<Transition>,\n _alph: Alphabet\n ): Set<Transition> {\n if (this._type === NFA) {\n return NFAUtils.validateTFunc(_states, _paths, _tfunc, _alph);\n } else {\n return DFAUtils.validateTFunc(_states, _paths, _tfunc, _alph);\n }\n }\n\n createPaths(_states: Set<State>, _alph: Alphabet): Map<State, Set<string>> {\n return DFAUtils.createPaths(_states, _alph);\n }\n\n determineStateOrder(\n _links: Map<string, Set<string>>,\n _tfunc: Set<Transition>,\n _states: Set<State>,\n _start: State,\n _accepts: Set<State>\n ): string[] {\n return DFAUtils.determineStateOrder(_links, _tfunc, _states, _start, _accepts);\n }\n }\n\n return FSAUtils;\n})();\n\n// Global export method for creating FSA\nexport const createFSA = (\n states: string | string[],\n alphabet: string | string[],\n transitions: TransitionInput | TransitionInput[],\n start: string,\n accepts: string | string[]\n): FSA => {\n // Type check and conversion for states\n const _states: Map<string, State> = new Map();\n if (typeof states === \"string\") {\n _states.set(states, new State(states));\n } else if (Array.isArray(states)) {\n for (const state of states) {\n if (!_states.has(state)) _states.set(state, new State(state));\n }\n } else {\n throw new TypeError(String(states));\n }\n\n // Convert remaining inputs\n const _alphabet = new Alphabet(alphabet);\n if (typeof start !== \"string\") throw new TypeError(String(start));\n const _start: State = getOrDefault(_states, start, null as unknown as State);\n\n const _accepts: Set<State> = new Set();\n if (typeof accepts === \"string\") {\n if (_states.has(accepts)) _accepts.add(getOrDefault(_states, accepts, null as unknown as State));\n } else if (Array.isArray(accepts)) {\n for (const state of accepts) {\n _accepts.add(getOrDefault(_states, state, null as unknown as State));\n }\n } else {\n throw new TypeError(String(accepts));\n }\n\n /*\n * Determine, based on tfunc structure, whether to create a DFA or NFA\n * If the \"to\" field of any member of the tfunc object is comma separated, or any input\n * char is \"\", then create an NFA\n */\n let transitionList: TransitionInput[];\n if (!Array.isArray(transitions) && typeof transitions === \"object\") transitionList = [transitions];\n else if (Array.isArray(transitions)) transitionList = transitions;\n else throw new TypeError(String(transitions));\n\n for (const tr of transitionList) {\n if (tr.to.indexOf(\",\") != -1 || tr.input === \"\")\n return createNFA(_states, _alphabet, transitionList, _start, _accepts);\n }\n return createDFA(_states, _alphabet, transitionList, _start, _accepts);\n};","import { type FSA } from \"../interfaces/FSA\";\nimport { type State, type Alphabet, type Transition } from \"../components\";\nimport { ErrorCode } from \"../globals/errors\";\nimport { checkStateDuplicates, getOrDefault, isSubsetOf } from \"../globals/globals\";\nimport { FSAUtils } from \"../utils\";\n\nexport class DFA implements FSA {\n // Primary FSA attributes\n #states: Set<State>;\n #alphabet: Alphabet;\n #tfunc: Set<Transition>;\n #start: State;\n #accepts: Set<State>;\n\n // Intermediary attributes used in constructor\n #paths: Map<State, Set<string>>; // States mapped to each member of Σ, will be empty after constructor returns\n #links: Map<string, Set<string>> = new Map(); // State names mapped to their dest state names\n #utils: InstanceType<typeof FSAUtils>;\n\n constructor(\n states: Set<State>,\n alphabet: Alphabet,\n tfunc: Set<Transition>,\n start: State,\n accepts: Set<State> | Record<string, never>\n ) {\n // initialize utils\n this.#utils = new FSAUtils(this.constructor as typeof DFA);\n\n // states validations\n if (checkStateDuplicates(states)) throw new Error(ErrorCode.DUPLICATE_STATE_NAMES);\n this.#states = states;\n\n this.#alphabet = alphabet;\n\n // Create paths map\n this.#paths = this.#utils.createPaths(this.#states, this.#alphabet);\n\n // Start/Accept validations\n if (!states.has(start)) throw new Error(ErrorCode.START_STATE_NOT_FOUND);\n this.#start = start;\n if (Object.keys(accepts).length === 0 && accepts.constructor === Object) accepts = new Set([]); // Allow for {}\n if (!isSubsetOf(accepts as Set<State>, states)) throw new Error(ErrorCode.ACCEPTS_NOT_SUBSET);\n this.#accepts = accepts as Set<State>;\n\n // TFunc validations\n this.#tfunc = this.#utils.validateTFunc(this.#states, this.#paths, tfunc, this.#alphabet);\n }\n\n /*\n * Getters\n */\n getStates(): Set<State> {\n return this.#states;\n }\n getAlphabet(): Alphabet {\n return this.#alphabet;\n }\n getTFunc(): Set<Transition> {\n return this.#tfunc;\n }\n getStartState(): State {\n return this.#start;\n }\n getAcceptStates(): Set<State> {\n return this.#accepts;\n }\n getType(): string {\n return \"DFA\";\n }\n\n generateDigraph(): string {\n // Prep outputs\n const acceptArr: string[] = [];\n for (const state of this.#accepts) acceptArr.push(state.name);\n\n // Duplicate origin/dest combinations should share a line\n const pairs: Map<string, string> = new Map();\n (Object.values([...this.#tfunc]) as Transition[]).map(function (t: Transition) {\n const key: string = t.origin.name + t.dest.name;\n let _input: string = t.input;\n if (_input === \"\") _input = \"ε\";\n if (!pairs.has(key)) {\n pairs.set(key, t.origin.name + \" -> \" + t.dest.name + ' [ label = \"' + _input + '\" ];');\n } else {\n /*\n * To edit an existing line, split out the input(s), convert to number, sort them ascending, and add the new one\n */\n let _line: string = getOrDefault(pairs, key, \"\");\n const _oldinput: string = _line.split('\"')[1];\n const _toAdd: string[] = _oldinput.split(\",\");\n _toAdd.push(_input);\n _toAdd.sort();\n _line = _line.replace('\"' + _oldinput + '\"', '\"' + _toAdd.toString() + '\"');\n pairs.set(key, _line);\n }\n });\n\n // return template literal\n return `digraph fsa {\n ${(Object.values(\n this.#utils.determineStateOrder(this.#links, this.#tfunc, this.#states, this.#start, this.#accepts)\n ) as string[])\n .map(function (str: string) {\n if (acceptArr.indexOf(str) !== -1) return str + \" [shape = doublecircle];\";\n else return str;\n })\n .join(\"\\n\\t\")}\n rankdir=LR;\n node [shape = point ]; qi;\n node [shape = circle];\n qi -> ${this.#start.name};\n ${(Object.values([...pairs]) as [string, string][])\n .map(function ([, val]) {\n return val;\n })\n .join(\"\\n\\t\")}\n }\n `;\n }\n}","import { DFA } from \"./DFA\";\nimport { type State, type Alphabet, type NFATransition, Transition } from \"../components\";\n\nexport class NFA extends DFA {\n constructor(\n states: Set<State>,\n alphabet: Alphabet,\n tfunc: Set<NFATransition>,\n start: State,\n accepts: Set<State> | Record<string, never>\n ) {\n // Implicitly add ε to alphabet\n if (!alphabet.sigma.includes(\"\")) alphabet.sigma.push(\"\");\n\n // If NFATransition has multiple dest states, break them up into separate Transitions\n const expandedTfunc: Set<Transition> = new Set<Transition>();\n for (const _t of tfunc) {\n _t.dest.forEach(_dest => {\n expandedTfunc.add(new Transition(_t.origin, _dest, _t.input));\n });\n }\n\n super(states, alphabet, expandedTfunc, start, accepts);\n }\n\n getType(): string {\n return \"NFA\";\n }\n}","import { type FSA } from \"../interfaces/FSA\";\nimport { State } from \"../components/State\";\nimport { DFA, NFA } from \"../automata\";\nimport { FSAUtils } from \"../utils\";\nimport { ErrorCode } from \"../globals/errors\";\nimport { instanceOf } from \"../globals/globals\";\n\nexport const simulateFSA = (\n w: string | string[],\n fsa: FSA,\n logging: boolean = false,\n returnEndState: boolean = false\n): boolean | string | string[] => {\n if (instanceOf(NFA, fsa)) {\n return simulateNFA(w, fsa as InstanceType<typeof NFA>, new FSAUtils(NFA), logging, returnEndState);\n } else {\n return simulateDFA(w, fsa as InstanceType<typeof DFA>, new FSAUtils(DFA), logging, returnEndState);\n }\n};\n\nexport const stepOnceFSA = (\n w: string,\n qin: string | string[],\n fsa: FSA,\n logging: boolean = false\n): string | string[] => {\n if (typeof w !== \"string\") {\n if (logging) console.error(\"Input w was invalid type: %O\", w);\n throw new TypeError();\n }\n if (typeof qin !== \"string\" && !Array.isArray(qin)) {\n if (logging) console.error(\"Input state was invalid type: %O\", qin);\n throw new TypeError();\n }\n\n // Step once\n if (logging) console.log(\"Input Processing Started\");\n let prevState: State | State[] = [];\n if (typeof qin === \"string\") {\n for (const state of fsa.getStates().values()) {\n if (qin === state.name) prevState = state;\n }\n if (!prevState || (Array.isArray(prevState) && prevState.length === 0))\n throw new Error(ErrorCode.INVALID_STATE_NAME);\n } else {\n prevState = [];\n for (const state of fsa.getStates().values()) {\n if (qin.includes(state.name)) prevState.push(state);\n }\n if (prevState.length !== qin.length) {\n throw new Error(ErrorCode.INVALID_STATE_NAME);\n }\n }\n\n let newState: State | State[];\n if (instanceOf(NFA, fsa)) newState = [...(new FSAUtils(NFA).receiveInput(fsa, w, prevState) as Set<State>)];\n else newState = new FSAUtils(DFA).receiveInput(fsa, w, prevState) as State;\n\n if (logging) console.log(\"%o x '%s' -> %o\", JSON.stringify(prevState), w, JSON.stringify(newState));\n if (logging) console.log(\"Input Processing Ended\");\n\n if (newState instanceof State) return newState.name;\n else {\n const retArray: string[] = [];\n for (const _s of newState) {\n retArray.push(_s.name);\n }\n return retArray;\n }\n};\n\n/*\n * Private methods\n */\nfunction simulateDFA(\n w: string | string[],\n dfa: InstanceType<typeof DFA>,\n utils: InstanceType<typeof FSAUtils>,\n logging: boolean,\n returnEndState: boolean\n): boolean | string {\n if (logging) console.log(\"Beginning DFA Simulation\");\n\n //Accept either string or string[] for w\n if (!Array.isArray(w)) {\n if (typeof w === \"string\") w = [...w];\n else {\n if (logging) console.error(\"Input w was invalid type: %O\", w);\n throw new TypeError();\n }\n }\n\n // Step through the DFA\n if (logging) console.log(\"Input Processing Started\");\n let currentState: State = dfa.getStartState();\n for (const char of w) {\n const prevState: State = currentState;\n currentState = utils.receiveInput(dfa, char, prevState) as State;\n if (logging) console.log(\"%o x '%s' -> %o\", JSON.stringify(prevState), char, JSON.stringify(currentState));\n }\n if (logging) console.log(\"Input Processing Ended\");\n\n // Check for acceptance\n if (dfa.getAcceptStates().has(currentState)) {\n if (logging) console.log(\"Input Accepted!\");\n if (returnEndState) return currentState.name;\n else return true;\n } else {\n if (logging) console.log(\"Input Rejected!\");\n if (returnEndState) return currentState.name;\n else return false;\n }\n}\n\nfunction simulateNFA(\n w: string | string[],\n nfa: InstanceType<typeof NFA>,\n utils: InstanceType<typeof FSAUtils>,\n logging: boolean,\n returnEndState: boolean\n): boolean | string[] {\n if (logging) console.log(\"Beginning NFA Simulation\");\n\n //Accept either string or string[] for w\n if (!(w instanceof Array)) {\n if (typeof w === \"string\") {\n if (w === \"\") w = [\"\"];\n else w = [...w];\n } else {\n if (logging) console.error(\"Input w was invalid type: %O\", w);\n throw new TypeError();\n }\n }\n\n if (logging) console.log(\"Input Processing Started\");\n let currentState: State[] = [nfa.getStartState()];\n for (const char of w) {\n const prevState: State[] = currentState;\n currentState = [...(utils.receiveInput(nfa, char, currentState) as Set<State>)];\n if (logging) console.log(\"%o x '%s' -> %o\", JSON.stringify(prevState), char, JSON.stringify(currentState));\n }\n if (logging) console.log(\"Input Processing Ended\");\n\n /*\n * Check for acceptance or rejection.\n * If returnEndState:\n * If accept, return all final accept states.\n * If reject, return all final states or if no final state return empty string\n */\n const retObj: string[] = [];\n for (const _accState of nfa.getAcceptStates()) {\n if (currentState.includes(_accState)) {\n if (!returnEndState) {\n if (logging) console.log(\"Input Accepted!\");\n return true;\n }\n retObj.push(_accState.name);\n }\n }\n if (retObj.length > 0) {\n if (logging) console.log(\"Input Accepted!\");\n return retObj;\n }\n\n if (logging) console.log(\"Input Rejected!\");\n if (returnEndState) {\n if (currentState.length > 0) {\n for (const _cState of currentState) retObj.push(_cState.name);\n }\n return retObj;\n } else {\n return false;\n }\n}"],"mappings":"owBAAA,IAAAA,GAAA,GAAAC,EAAAD,GAAA,eAAAE,EAAA,gBAAAC,EAAA,gBAAAC,ICAO,IAAMC,EAA8C,OAAO,OAAO,CACvE,wBAAyB,QACzB,sBAAuB,QACvB,mBAAoB,QACpB,sBAAuB,QACvB,mBAAoB,QACpB,uBAAwB,QACxB,qBAAsB,QACtB,4BAA6B,QAC7B,mBAAoB,QACpB,sBAAuB,QACvB,0BAA2B,QAC3B,4BAA6B,QAC7B,oBAAqB,OACvB,CAAC,ECZM,IAAMC,EAAN,KAAY,CAGjB,YAAYC,EAAc,CAExB,GADA,KAAK,KAAOA,EACR,CAAC,KAAK,KAAM,MAAM,IAAI,MAAMC,EAAU,kBAAkB,CAC9D,CACF,ECNO,IAAMC,EAASC,GACpBA,EAAM,OAAO,CAACC,EAAGC,IAAM,OAAO,OAAOD,EAAG,CAAE,CAACC,CAAC,GAAID,EAAEC,CAAC,GAAK,GAAK,CAAE,CAAC,EAAG,CAAC,CAA2B,EAGpFC,EAAcC,GACzB,OAAO,KAAKA,CAAI,EAAE,OAAOH,GAAKG,EAAKH,CAAC,EAAI,CAAC,EAapC,IAAMI,EAAwBC,GAAgC,CACnE,IAAMC,EAAqB,IAAI,IAC/B,QAAWC,KAAQF,EAAQ,CACzB,GAAIC,EAAM,IAAIC,EAAK,IAAI,EAAG,MAAO,GACjCD,EAAM,IAAIC,EAAK,IAAI,CACrB,CACA,MAAO,EACT,EAEaC,EAAe,CAAOC,EAAgBC,EAAQC,IAAuB,CAChF,IAAMC,EAAMH,EAAI,IAAIC,CAAG,EACvB,OAAOE,GAAcD,CACvB,EAIaE,EAAa,CAAmBC,EAA0BC,IAC9DA,aAAeD,GAAS,EAAQA,EAAK,MAASA,EAAK,OAASC,EAAI,YAAY,KAGxEC,EAAa,CAAIC,EAAgBC,IAA8B,CAC1E,QAAWX,KAAQU,EACjB,GAAI,CAACC,EAAS,IAAIX,CAAI,EAAG,MAAO,GAElC,MAAO,EACT,EC3CO,IAAMY,EAAN,KAAe,CAGpB,YAAYC,EAA0B,CACpC,GAAI,CAAC,MAAM,QAAQA,CAAK,EACtB,GAAI,OAAOA,GAAU,SAAUA,EAAQ,CAAC,GAAGA,CAAK,MAC3C,OAAM,IAAI,UAGjB,GADA,KAAK,MAAQA,EACTC,EAAWC,EAAM,KAAK,KAAK,CAAC,EAAE,OAAS,EAAG,MAAM,IAAI,MAAMC,EAAU,uBAAuB,CACjG,CACF,ECZO,IAAMC,EAAN,KAAoB,CAKzB,YAAYC,EAAeC,EAAeC,EAAe,CACvD,KAAK,OAASF,EACd,KAAK,KAAOC,EACZ,KAAK,MAAQC,CACf,CACF,ECVO,IAAMC,EAAN,KAAiB,CAKtB,YAAYC,EAAeC,EAAaC,EAAe,CACrD,KAAK,OAASF,EACd,KAAK,KAAOC,EACZ,KAAK,MAAQC,CACf,CACF,ECPO,IAAMC,EAAN,KAAe,CAKpB,OAAO,cACLC,EACAC,EACAC,EACAC,EACiB,CACjB,IAAMC,EAA4B,IAAI,IAEtC,QAAWC,KAAMH,EAAQ,CAEvB,GAAI,CAACF,EAAQ,IAAIK,EAAG,MAAM,EACxB,cAAQ,MAAM,+BAAgC,KAAK,UAAUA,EAAG,MAAM,CAAC,EACjE,IAAI,MAAMC,EAAU,sBAAsB,EAElD,GAAI,CAACN,EAAQ,IAAIK,EAAG,IAAI,EACtB,cAAQ,MAAM,6BAA8B,KAAK,UAAUA,EAAG,IAAI,CAAC,EAC7D,IAAI,MAAMC,EAAU,oBAAoB,EAGhD,IAAMC,EAA6BC,EAAaP,EAAQI,EAAG,OAAQ,IAAI,GAAK,EAG5E,GAAI,KAAK,iBAAiBA,EAAG,MAAOF,CAAK,EACvC,GAAIF,EAAO,IAAII,EAAG,MAAM,GAAKE,EAAc,IAAIF,EAAG,KAAK,EACrDD,EAAS,IAAIC,CAAE,EACfE,EAAc,OAAOF,EAAG,KAAK,EACzBE,EAAc,OAAS,GACzBN,EAAO,OAAOI,EAAG,MAAM,MAGzB,OAAM,IAAI,MAAMC,EAAU,2BAA2B,MAGvD,OAAM,IAAI,MAAMA,EAAU,kBAAkB,CAEhD,CAEA,GAAIL,EAAO,KAAO,EAAG,CACnB,QAAQ,MAAM,gDAAgD,EAC9D,OAAW,CAACQ,EAAKC,CAAG,IAAKT,EACvB,QAAQ,MAAM,2BAA4BQ,EAAI,KAAM,CAAC,GAAGC,CAAG,EAAE,KAAK,GAAG,CAAC,EAExE,MAAM,IAAI,MAAMJ,EAAU,2BAA2B,CACvD,CAEA,OAAOF,CACT,CAEA,OAAO,YAAYJ,EAAqBG,EAA0C,CAChF,IAAMF,EAAkC,IAAI,IAC5C,QAAWU,KAASX,EAClB,QAAWY,KAAQT,EAAM,MAAO,CAC9B,IAAMI,EAA6BC,EAAaP,EAAQU,EAAO,IAAI,GAAK,EACpEV,EAAO,IAAIU,CAAK,EAAGJ,EAAc,IAAIK,CAAI,EACxCX,EAAO,IAAIU,EAAO,IAAI,IAAI,CAACC,CAAI,CAAC,CAAC,CACxC,CAGF,OAAOX,CACT,CAGA,OAAO,oBACLY,EACAX,EACAF,EACAc,EACAC,EACU,CACV,IAAMC,EAAwB,CAAC,EAG/BH,EAAS,IAAI,IACb,QAAWI,KAAMf,EAAQ,CACvB,IAAMgB,EAA6BV,EAAaK,EAAQI,EAAG,OAAO,KAAM,IAAI,GAAK,EAC7EJ,EAAO,IAAII,EAAG,OAAO,IAAI,EAAGC,EAAc,IAAID,EAAG,KAAK,IAAI,EACzDJ,EAAO,IAAII,EAAG,OAAO,KAAM,IAAI,IAAI,CAACA,EAAG,KAAK,IAAI,CAAC,CAAC,CACzD,CAGA,KAAK,WAAWD,EAAaF,EAAO,KAAMD,CAAM,EAGhD,IAAMM,EAAqB,CAAC,EAC3B,OAAO,OAAO,CAAC,GAAGnB,CAAO,CAAC,EAAc,IAAKW,GAAiBQ,EAAS,KAAKR,EAAM,IAAI,CAAC,EACxF,IAAMS,EAAaD,EAAS,OAAOE,GAAK,CAACL,EAAY,SAASK,CAAC,CAAC,EAChE,OAAID,EAAW,OAAS,IACtB,QAAQ,KAAK,qEAAsEA,CAAU,EAC7F,KAAK,iBAAiBA,EAAYpB,EAASe,EAAUb,CAAM,GAGtDc,CACT,CAGA,OAAO,iBACLI,EACApB,EACAe,EACAb,EACA,CAEA,QAAWS,KAASX,EACdoB,EAAW,QAAQT,EAAM,IAAI,IAAM,IAAIX,EAAQ,OAAOW,CAAK,EAGjE,QAAWA,KAASI,EACdK,EAAW,QAAQT,EAAM,IAAI,IAAM,IAAII,EAAS,OAAOJ,CAAK,EAGlE,QAAWM,KAAMf,GACXkB,EAAW,QAAQH,EAAG,OAAO,IAAI,IAAM,IAAMG,EAAW,QAAQH,EAAG,KAAK,IAAI,IAAM,KAAIf,EAAO,OAAOe,CAAE,CAE9G,CAGA,OAAO,WAAWK,EAAeC,EAAcV,EAAkC,CAC/ES,EAAI,KAAKC,CAAI,EACb,IAAMC,EAAUhB,EAAaK,EAAQU,EAAM,IAAI,GAAa,EAC5D,QAAWE,KAAMD,EACXF,EAAI,QAAQG,CAAE,IAAM,IAAI,KAAK,WAAWH,EAAKG,EAAIZ,CAAM,CAE/D,CAGA,OAAO,iBAAiBa,EAAevB,EAA0B,CAC/D,OAAIuB,IAAU,GAAW,GAClBvB,EAAM,MAAM,QAAQuB,CAAK,IAAM,EACxC,CACF,EASaC,EAAY,CACvBC,EACAC,EACAC,EACAC,EACAC,IAC6B,CAE7B,IAAM9B,EAA0B,IAAI,IACpC,QAAWe,KAAMa,EAAa,CAC5B,GAAI,CAACb,EAAG,MAAQ,CAACA,EAAG,IAAM,CAACA,EAAG,MAAO,MAAM,IAAI,MAAMX,EAAU,yBAAyB,EACxF,IAAM2B,EAAiBzB,EAAaoB,EAAQX,EAAG,KAAM,IAAwB,EACvEiB,EAAe1B,EAAaoB,EAAQX,EAAG,GAAI,IAAwB,EACzEf,EAAO,IAAI,IAAIiC,EAAWF,EAASC,EAAOjB,EAAG,KAAK,CAAC,CACrD,CACA,OAAO,IAAImB,EAAI,IAAI,IAAIR,EAAO,OAAO,CAAC,EAAGC,EAAU3B,EAAQ6B,EAAOC,CAAO,CAC3E,EC7JO,IAAMK,EAAN,cAAuBC,CAAS,CAErC,OAAO,iBAAiBC,EAAeC,EAA0B,CAC/D,OAAOA,EAAM,MAAM,QAAQD,CAAK,IAAM,IAAMA,IAAU,EACxD,CAGA,OAAO,iBAAiBE,EAAyBC,EAAyB,CACxE,IAAIC,EAAO,GACX,KAAOA,GAAM,CACXA,EAAO,GAGP,IAAMC,EAA+B,MAAM,KAAKH,CAAM,EAAE,OAAOI,GACtDH,EAAM,SAASG,EAAI,MAAM,GAAKA,EAAI,QAAU,EACpD,EAGD,QAAWC,KAAMF,EACVF,EAAM,SAASI,EAAG,IAAI,IACzBJ,EAAM,KAAKI,EAAG,IAAI,EAClBH,EAAO,GAGb,CACA,OAAOD,CACT,CAGA,OAAO,cACLK,EACAC,EACAP,EACAD,EACiB,CACjB,IAAMS,EAA4B,IAAI,IAEtC,QAAWH,KAAML,EAAQ,CACvB,IAAIS,EAAO,GAGX,GAAI,CAACH,EAAQ,IAAID,EAAG,MAAM,EACxB,cAAQ,MAAM,+BAAgC,KAAK,UAAUA,EAAG,MAAM,CAAC,EACjE,IAAI,MAAMK,EAAU,sBAAsB,EAElD,GAAI,CAACJ,EAAQ,IAAID,EAAG,IAAI,EACtB,cAAQ,MAAM,6BAA8B,KAAK,UAAUA,EAAG,IAAI,CAAC,EAC7D,IAAI,MAAMK,EAAU,oBAAoB,EAIhD,QAAWC,KAAWH,EAChBG,EAAQ,SAAWN,EAAG,QAAUM,EAAQ,OAASN,EAAG,MAAQM,EAAQ,QAAUN,EAAG,QAAOI,EAAO,IAIrG,GAAI,CAACA,GACCF,EAAO,IAAIF,EAAG,MAAM,EACtB,GAAI,KAAK,iBAAiBA,EAAG,MAAON,CAAK,EACvCS,EAAS,IAAIH,CAAE,MAEf,OAAM,IAAI,MAAMK,EAAU,kBAAkB,CAIpD,CAEA,OAAOF,CACT,CACF,EAEaI,EAAY,CACvBC,EACAC,EACAC,EACAC,EACAC,IAC6B,CAE7B,IAAMjB,EAA6B,IAAI,IACvC,QAAWkB,KAAMH,EAAa,CAC5B,GAAI,CAACG,EAAG,MAAQ,CAACA,EAAG,IAAO,CAACA,EAAG,OAASA,EAAG,QAAU,GACnD,MAAM,IAAI,MAAMR,EAAU,yBAAyB,EACrD,IAAMS,EAAiBC,EAAaP,EAAQK,EAAG,KAAM,IAAwB,EACvEG,EAAkBH,EAAG,GAAG,MAAM,GAAG,EAEjCI,EAAsB,CAAC,EAC7BD,EAAM,QAAQE,GAAS,CACrBD,EAAW,KAAKF,EAAaP,EAAQU,EAAO,IAAwB,CAAC,CACvE,CAAC,EAEDvB,EAAO,IAAI,IAAIwB,EAAcL,EAASG,EAAYJ,EAAG,KAAK,CAAC,CAC7D,CACA,OAAO,IAAIO,EAAI,IAAI,IAAIZ,EAAO,OAAO,CAAC,EAAGC,EAAUd,EAAQgB,EAAOC,CAAO,CAC3E,ECvFO,IAAMS,GAAY,IAAM,CAI7B,SAASC,EAAgBC,EAA+BC,EAAeC,EAAqB,CAC1F,GAAIF,EAAI,YAAY,EAAE,MAAM,QAAQC,CAAK,IAAM,GAAI,MAAM,IAAI,MAAME,EAAU,kBAAkB,EAC/F,GAAI,CAACH,EAAI,UAAU,EAAE,IAAIE,CAAK,EAAG,MAAM,IAAI,MAAMC,EAAU,qBAAqB,EAEhF,IAAMC,EAAO,MAAM,KAAKJ,EAAI,SAAS,CAAC,EAAE,KAAKK,GACpCA,EAAI,SAAWH,GAASG,EAAI,QAAUJ,CAC9C,EAED,GAAIG,EAAM,OAAOA,EAAK,KACjB,MAAM,IAAI,MAAMD,EAAU,yBAAyB,CAC1D,CAEA,SAASG,EAAgBC,EAA+BN,EAAeC,EAA4B,CACjG,IAAIE,EAAqB,CAAC,EAC1B,GAAIG,EAAI,YAAY,EAAE,MAAM,QAAQN,CAAK,IAAM,GAAI,MAAM,IAAI,MAAME,EAAU,kBAAkB,EAM/F,GAHAD,EAAQM,EAAiBD,EAAI,SAAS,EAAGL,CAAK,EAG1CD,IAAU,GAAI,OAAO,IAAI,IAAWC,CAAK,EAG7C,QAAWO,KAAMP,EAAO,CACtB,IAAMQ,EAA2B,MAAM,KAAKH,EAAI,SAAS,CAAC,EAAE,OAAOF,GAC1DA,EAAI,SAAWI,GAAMJ,EAAI,QAAUJ,CAC3C,EAEDG,EAAOA,EAAK,OAAOM,CAAU,CAC/B,CAEA,IAAMC,EAAqB,CAAC,EAC5B,GAAIP,EAAK,OAAS,EAChB,QAAWK,KAAML,EAAMO,EAAU,KAAKF,EAAG,IAAI,UACpCL,EAAK,SAAW,EACzBO,EAAU,KAAKP,EAAK,CAAC,EAAE,IAAI,MAG3B,QAAO,IAAI,IAMb,OAF2B,IAAI,IAAWI,EAAiBD,EAAI,SAAS,EAAGI,CAAS,CAAC,CAGvF,CAEA,SAASH,EAAiBI,EAAyBV,EAAyB,CAC1E,OAAOW,EAAS,iBAAiBD,EAAQV,CAAK,CAChD,CAEA,MAAMJ,CAAS,CAGb,YAAYgB,EAA4B,CACtC,KAAK,MAAQA,CACf,CAEA,aAAaC,EAAUd,EAAeC,EAA4C,CAChF,GAAIc,EAAWC,EAAKF,CAAG,EACrB,OAAIb,aAAiBgB,EAAcZ,EAAgBS,EAAiCd,EAAO,CAACC,CAAK,CAAC,EACtFI,EAAgBS,EAAiCd,EAAOC,CAAK,EAEzE,GAAI,MAAM,QAAQA,CAAK,EAAG,CACxB,GAAIA,EAAM,OAAS,EACjB,cAAQ,MAAM,iDAAiD,EACzD,IAAI,MAAMC,EAAU,mBAAmB,EAE7CD,EAAQA,EAAM,CAAC,CAEnB,CACA,OAAOH,EAAgBgB,EAAiCd,EAAOC,CAAK,CAExE,CAEA,cACEiB,EACAC,EACAR,EACAS,EACiB,CACjB,OAAI,KAAK,QAAUJ,EACVJ,EAAS,cAAcM,EAASC,EAAQR,EAAQS,CAAK,EAErDC,EAAS,cAAcH,EAASC,EAAQR,EAAQS,CAAK,CAEhE,CAEA,YAAYF,EAAqBE,EAA0C,CACzE,OAAOC,EAAS,YAAYH,EAASE,CAAK,CAC5C,CAEA,oBACEE,EACAX,EACAO,EACAK,EACAC,EACU,CACV,OAAOH,EAAS,oBAAoBC,EAAQX,EAAQO,EAASK,EAAQC,CAAQ,CAC/E,CACF,CAEA,OAAO3B,CACT,GAAG,EAGU4B,EAAY,CACvBC,EACAC,EACAC,EACAC,EACAC,IACQ,CAER,IAAMZ,EAA8B,IAAI,IACxC,GAAI,OAAOQ,GAAW,SACpBR,EAAQ,IAAIQ,EAAQ,IAAIT,EAAMS,CAAM,CAAC,UAC5B,MAAM,QAAQA,CAAM,EAC7B,QAAWzB,KAASyB,EACbR,EAAQ,IAAIjB,CAAK,GAAGiB,EAAQ,IAAIjB,EAAO,IAAIgB,EAAMhB,CAAK,CAAC,MAG9D,OAAM,IAAI,UAAU,OAAOyB,CAAM,CAAC,EAIpC,IAAMK,EAAY,IAAIC,EAASL,CAAQ,EACvC,GAAI,OAAOE,GAAU,SAAU,MAAM,IAAI,UAAU,OAAOA,CAAK,CAAC,EAChE,IAAMN,EAAgBU,EAAaf,EAASW,EAAO,IAAwB,EAErEL,EAAuB,IAAI,IACjC,GAAI,OAAOM,GAAY,SACjBZ,EAAQ,IAAIY,CAAO,GAAGN,EAAS,IAAIS,EAAaf,EAASY,EAAS,IAAwB,CAAC,UACtF,MAAM,QAAQA,CAAO,EAC9B,QAAW7B,KAAS6B,EAClBN,EAAS,IAAIS,EAAaf,EAASjB,EAAO,IAAwB,CAAC,MAGrE,OAAM,IAAI,UAAU,OAAO6B,CAAO,CAAC,EAQrC,IAAII,EACJ,GAAI,CAAC,MAAM,QAAQN,CAAW,GAAK,OAAOA,GAAgB,SAAUM,EAAiB,CAACN,CAAW,UACxF,MAAM,QAAQA,CAAW,EAAGM,EAAiBN,MACjD,OAAM,IAAI,UAAU,OAAOA,CAAW,CAAC,EAE5C,QAAWO,KAAMD,EACf,GAAIC,EAAG,GAAG,QAAQ,GAAG,GAAK,IAAMA,EAAG,QAAU,GAC3C,OAAOC,EAAUlB,EAASa,EAAWG,EAAgBX,EAAQC,CAAQ,EAEzE,OAAOa,EAAUnB,EAASa,EAAWG,EAAgBX,EAAQC,CAAQ,CACvE,EC/KA,IAAAc,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAMaC,EAAN,KAAyB,CAa9B,YACEC,EACAC,EACAC,EACAC,EACAC,EACA,CAjBFC,EAAA,KAAAd,GACAc,EAAA,KAAAb,GACAa,EAAA,KAAAZ,GACAY,EAAA,KAAAX,GACAW,EAAA,KAAAV,GAGAU,EAAA,KAAAT,GACAS,EAAA,KAAAR,EAAmC,IAAI,KACvCQ,EAAA,KAAAP,GAaE,GAHAQ,EAAA,KAAKR,EAAS,IAAIS,EAAS,KAAK,WAAyB,GAGrDC,EAAqBR,CAAM,EAAG,MAAM,IAAI,MAAMS,EAAU,qBAAqB,EASjF,GARAH,EAAA,KAAKf,EAAUS,GAEfM,EAAA,KAAKd,EAAYS,GAGjBK,EAAA,KAAKV,EAASc,EAAA,KAAKZ,GAAO,YAAYY,EAAA,KAAKnB,GAASmB,EAAA,KAAKlB,EAAS,GAG9D,CAACQ,EAAO,IAAIG,CAAK,EAAG,MAAM,IAAI,MAAMM,EAAU,qBAAqB,EAGvE,GAFAH,EAAA,KAAKZ,EAASS,GACV,OAAO,KAAKC,CAAO,EAAE,SAAW,GAAKA,EAAQ,cAAgB,SAAQA,EAAU,IAAI,IAAI,CAAC,CAAC,GACzF,CAACO,EAAWP,EAAuBJ,CAAM,EAAG,MAAM,IAAI,MAAMS,EAAU,kBAAkB,EAC5FH,EAAA,KAAKX,EAAWS,GAGhBE,EAAA,KAAKb,EAASiB,EAAA,KAAKZ,GAAO,cAAcY,EAAA,KAAKnB,GAASmB,EAAA,KAAKd,GAAQM,EAAOQ,EAAA,KAAKlB,EAAS,EAC1F,CAKA,WAAwB,CACtB,OAAOkB,EAAA,KAAKnB,EACd,CACA,aAAwB,CACtB,OAAOmB,EAAA,KAAKlB,EACd,CACA,UAA4B,CAC1B,OAAOkB,EAAA,KAAKjB,EACd,CACA,eAAuB,CACrB,OAAOiB,EAAA,KAAKhB,EACd,CACA,iBAA8B,CAC5B,OAAOgB,EAAA,KAAKf,EACd,CACA,SAAkB,CAChB,MAAO,KACT,CAEA,iBAA0B,CAExB,IAAMiB,EAAsB,CAAC,EAC7B,QAAWC,KAASH,EAAA,KAAKf,GAAUiB,EAAU,KAAKC,EAAM,IAAI,EAG5D,IAAMC,EAA6B,IAAI,IACvC,OAAC,OAAO,OAAO,CAAC,GAAGJ,EAAA,KAAKjB,EAAM,CAAC,EAAmB,IAAI,SAAUsB,EAAe,CAC7E,IAAMC,EAAcD,EAAE,OAAO,KAAOA,EAAE,KAAK,KACvCE,EAAiBF,EAAE,MAEvB,GADIE,IAAW,KAAIA,EAAS,UACxB,CAACH,EAAM,IAAIE,CAAG,EAChBF,EAAM,IAAIE,EAAKD,EAAE,OAAO,KAAO,OAASA,EAAE,KAAK,KAAO,eAAiBE,EAAS,MAAM,MACjF,CAIL,IAAIC,EAAgBC,EAAaL,EAAOE,EAAK,EAAE,EACzCI,EAAoBF,EAAM,MAAM,GAAG,EAAE,CAAC,EACtCG,EAAmBD,EAAU,MAAM,GAAG,EAC5CC,EAAO,KAAKJ,CAAM,EAClBI,EAAO,KAAK,EACZH,EAAQA,EAAM,QAAQ,IAAME,EAAY,IAAK,IAAMC,EAAO,SAAS,EAAI,GAAG,EAC1EP,EAAM,IAAIE,EAAKE,CAAK,CACtB,CACF,CAAC,EAGM;AAAA,YACE,OAAO,OACRR,EAAA,KAAKZ,GAAO,oBAAoBY,EAAA,KAAKb,GAAQa,EAAA,KAAKjB,GAAQiB,EAAA,KAAKnB,GAASmB,EAAA,KAAKhB,GAAQgB,EAAA,KAAKf,EAAQ,CACpG,EACG,IAAI,SAAU2B,EAAa,CAC1B,OAAIV,EAAU,QAAQU,CAAG,IAAM,GAAWA,EAAM,2BACpCA,CACd,CAAC,EACA,KAAK;AAAA,EAAM,CAAC;AAAA;AAAA;AAAA;AAAA,kBAIPZ,EAAA,KAAKhB,GAAO,IAAI;AAAA,YACrB,OAAO,OAAO,CAAC,GAAGoB,CAAK,CAAC,EACxB,IAAI,SAAU,CAAC,CAAES,CAAG,EAAG,CACtB,OAAOA,CACT,CAAC,EACA,KAAK;AAAA,EAAM,CAAC;AAAA;AAAA,OAGvB,CACF,EAhHEhC,EAAA,YACAC,EAAA,YACAC,EAAA,YACAC,EAAA,YACAC,EAAA,YAGAC,EAAA,YACAC,EAAA,YACAC,EAAA,YCdK,IAAM0B,EAAN,cAAkBC,CAAI,CAC3B,YACEC,EACAC,EACAC,EACAC,EACAC,EACA,CAEKH,EAAS,MAAM,SAAS,EAAE,GAAGA,EAAS,MAAM,KAAK,EAAE,EAGxD,IAAMI,EAAiC,IAAI,IAC3C,QAAWC,KAAMJ,EACfI,EAAG,KAAK,QAAQC,GAAS,CACvBF,EAAc,IAAI,IAAIG,EAAWF,EAAG,OAAQC,EAAOD,EAAG,KAAK,CAAC,CAC9D,CAAC,EAGH,MAAMN,EAAQC,EAAUI,EAAeF,EAAOC,CAAO,CACvD,CAEA,SAAkB,CAChB,MAAO,KACT,CACF,ECrBO,IAAMK,EAAc,CACzBC,EACAC,EACAC,EAAmB,GACnBC,EAA0B,KAEtBC,EAAWC,EAAKJ,CAAG,EACdK,GAAYN,EAAGC,EAAiC,IAAIM,EAASF,CAAG,EAAGH,EAASC,CAAc,EAE1FK,GAAYR,EAAGC,EAAiC,IAAIM,EAASE,CAAG,EAAGP,EAASC,CAAc,EAIxFO,EAAc,CACzBV,EACAW,EACAV,EACAC,EAAmB,KACG,CACtB,GAAI,OAAOF,GAAM,SACf,MAAIE,GAAS,QAAQ,MAAM,+BAAgCF,CAAC,EACtD,IAAI,UAEZ,GAAI,OAAOW,GAAQ,UAAY,CAAC,MAAM,QAAQA,CAAG,EAC/C,MAAIT,GAAS,QAAQ,MAAM,mCAAoCS,CAAG,EAC5D,IAAI,UAIRT,GAAS,QAAQ,IAAI,0BAA0B,EACnD,IAAIU,EAA6B,CAAC,EAClC,GAAI,OAAOD,GAAQ,SAAU,CAC3B,QAAWE,KAASZ,EAAI,UAAU,EAAE,OAAO,EACrCU,IAAQE,EAAM,OAAMD,EAAYC,GAEtC,GAAI,CAACD,GAAc,MAAM,QAAQA,CAAS,GAAKA,EAAU,SAAW,EAClE,MAAM,IAAI,MAAME,EAAU,kBAAkB,CAChD,KAAO,CACLF,EAAY,CAAC,EACb,QAAWC,KAASZ,EAAI,UAAU,EAAE,OAAO,EACrCU,EAAI,SAASE,EAAM,IAAI,GAAGD,EAAU,KAAKC,CAAK,EAEpD,GAAID,EAAU,SAAWD,EAAI,OAC3B,MAAM,IAAI,MAAMG,EAAU,kBAAkB,CAEhD,CAEA,IAAIC,EAOJ,GANIX,EAAWC,EAAKJ,CAAG,EAAGc,EAAW,CAAC,GAAI,IAAIR,EAASF,CAAG,EAAE,aAAaJ,EAAKD,EAAGY,CAAS,CAAgB,EACrGG,EAAW,IAAIR,EAASE,CAAG,EAAE,aAAaR,EAAKD,EAAGY,CAAS,EAE5DV,GAAS,QAAQ,IAAI,kBAAmB,KAAK,UAAUU,CAAS,EAAGZ,EAAG,KAAK,UAAUe,CAAQ,CAAC,EAC9Fb,GAAS,QAAQ,IAAI,wBAAwB,EAE7Ca,aAAoBC,EAAO,OAAOD,EAAS,KAC1C,CACH,IAAME,EAAqB,CAAC,EAC5B,QAAWC,KAAMH,EACfE,EAAS,KAAKC,EAAG,IAAI,EAEvB,OAAOD,CACT,CACF,EAKA,SAAST,GACPR,EACAmB,EACAC,EACAlB,EACAC,EACkB,CAIlB,GAHID,GAAS,QAAQ,IAAI,0BAA0B,EAG/C,CAAC,MAAM,QAAQF,CAAC,EAClB,GAAI,OAAOA,GAAM,SAAUA,EAAI,CAAC,GAAGA,CAAC,MAElC,OAAIE,GAAS,QAAQ,MAAM,+BAAgCF,CAAC,EACtD,IAAI,UAKVE,GAAS,QAAQ,IAAI,0BAA0B,EACnD,IAAImB,EAAsBF,EAAI,cAAc,EAC5C,QAAWG,KAAQtB,EAAG,CACpB,IAAMY,EAAmBS,EACzBA,EAAeD,EAAM,aAAaD,EAAKG,EAAMV,CAAS,EAClDV,GAAS,QAAQ,IAAI,kBAAmB,KAAK,UAAUU,CAAS,EAAGU,EAAM,KAAK,UAAUD,CAAY,CAAC,CAC3G,CAIA,OAHInB,GAAS,QAAQ,IAAI,wBAAwB,EAG7CiB,EAAI,gBAAgB,EAAE,IAAIE,CAAY,GACpCnB,GAAS,QAAQ,IAAI,iBAAiB,EACtCC,EAAuBkB,EAAa,KAC5B,KAERnB,GAAS,QAAQ,IAAI,iBAAiB,EACtCC,EAAuBkB,EAAa,KAC5B,GAEhB,CAEA,SAASf,GACPN,EACAuB,EACAH,EACAlB,EACAC,EACoB,CAIpB,GAHID,GAAS,QAAQ,IAAI,0BAA0B,EAG/C,EAAEF,aAAa,OACjB,GAAI,OAAOA,GAAM,SACXA,IAAM,GAAIA,EAAI,CAAC,EAAE,EAChBA,EAAI,CAAC,GAAGA,CAAC,MAEd,OAAIE,GAAS,QAAQ,MAAM,+BAAgCF,CAAC,EACtD,IAAI,UAIVE,GAAS,QAAQ,IAAI,0BAA0B,EACnD,IAAImB,EAAwB,CAACE,EAAI,cAAc,CAAC,EAChD,QAAWD,KAAQtB,EAAG,CACpB,IAAMY,EAAqBS,EAC3BA,EAAe,CAAC,GAAID,EAAM,aAAaG,EAAKD,EAAMD,CAAY,CAAgB,EAC1EnB,GAAS,QAAQ,IAAI,kBAAmB,KAAK,UAAUU,CAAS,EAAGU,EAAM,KAAK,UAAUD,CAAY,CAAC,CAC3G,CACInB,GAAS,QAAQ,IAAI,wBAAwB,EAQjD,IAAMsB,EAAmB,CAAC,EAC1B,QAAWC,KAAaF,EAAI,gBAAgB,EAC1C,GAAIF,EAAa,SAASI,CAAS,EAAG,CACpC,GAAI,CAACtB,EACH,OAAID,GAAS,QAAQ,IAAI,iBAAiB,EACnC,GAETsB,EAAO,KAAKC,EAAU,IAAI,CAC5B,CAEF,GAAID,EAAO,OAAS,EAClB,OAAItB,GAAS,QAAQ,IAAI,iBAAiB,EACnCsB,EAIT,GADItB,GAAS,QAAQ,IAAI,iBAAiB,EACtCC,EAAgB,CAClB,GAAIkB,EAAa,OAAS,EACxB,QAAWK,KAAWL,EAAcG,EAAO,KAAKE,EAAQ,IAAI,EAE9D,OAAOF,CACT,KACE,OAAO,EAEX","names":["modules_exports","__export","createFSA","simulateFSA","stepOnceFSA","ErrorCode","State","name","ErrorCode","count","names","a","b","duplicates","dict","checkStateDuplicates","states","check","item","getOrDefault","map","key","defaultValue","val","instanceOf","ctor","obj","isSubsetOf","subset","superset","Alphabet","sigma","duplicates","count","ErrorCode","NFATransition","origin","dest","input","Transition","origin","dest","input","DFAUtils","_states","_paths","_tfunc","_alph","newTFunc","_t","ErrorCode","pathStateVals","getOrDefault","key","val","state","char","_links","_start","_accepts","statesOrder","tr","linkStateVals","stateArr","deadStates","x","arr","name","nameVal","st","input","createDFA","states","alphabet","transitions","start","accepts","fromVal","toVal","Transition","DFA","NFAUtils","DFAUtils","input","_alph","_tfunc","state","cont","epsTransitions","obj","_t","_states","_paths","newTFunc","skip","ErrorCode","_checkT","createNFA","states","alphabet","transitions","start","accepts","tr","fromVal","getOrDefault","toVal","destStates","_dest","NFATransition","NFA","FSAUtils","receiveInputDFA","dfa","input","state","ErrorCode","path","obj","receiveInputNFA","nfa","populateEpsilons","_s","_addToPath","resultArr","_tfunc","NFAUtils","v","fsa","instanceOf","NFA","State","_states","_paths","_alph","DFAUtils","_links","_start","_accepts","createFSA","states","alphabet","transitions","start","accepts","_alphabet","Alphabet","getOrDefault","transitionList","tr","createNFA","createDFA","_states","_alphabet","_tfunc","_start","_accepts","_paths","_links","_utils","DFA","states","alphabet","tfunc","start","accepts","__privateAdd","__privateSet","FSAUtils","checkStateDuplicates","ErrorCode","__privateGet","isSubsetOf","acceptArr","state","pairs","t","key","_input","_line","getOrDefault","_oldinput","_toAdd","str","val","NFA","DFA","states","alphabet","tfunc","start","accepts","expandedTfunc","_t","_dest","Transition","simulateFSA","w","fsa","logging","returnEndState","instanceOf","NFA","simulateNFA","FSAUtils","simulateDFA","DFA","stepOnceFSA","qin","prevState","state","ErrorCode","newState","State","retArray","_s","dfa","utils","currentState","char","nfa","retObj","_accState","_cState"]}
1
+ {"version":3,"sources":["../src/modules.ts","../src/globals/errors.ts","../src/components/State.ts","../src/globals/globals.ts","../src/components/Alphabet.ts","../src/components/NFATransition.ts","../src/components/Transition.ts","../src/utils/DFAUtils.ts","../src/utils/NFAUtils.ts","../src/utils/FSAUtils.ts","../src/automata/DFA.ts","../src/automata/NFA.ts","../src/engine/Simulators.ts"],"sourcesContent":["export { simulateFSA, stepOnceFSA } from \"./engine/Simulators\";\nexport { createFSA } from \"./utils/FSAUtils\";\nexport type { TransitionInput } from \"./utils/DFAUtils\";","export const ErrorCode: Readonly<Record<string, string>> = Object.freeze({\n DUPLICATE_ALPHABET_VALS: \"E-001\",\n DUPLICATE_STATE_NAMES: \"E-002\",\n INVALID_STATE_NAME: \"E-003\",\n START_STATE_NOT_FOUND: \"E-004\",\n ACCEPTS_NOT_SUBSET: \"E-005\",\n ORIGIN_STATE_NOT_FOUND: \"E-006\",\n DEST_STATE_NOT_FOUND: \"E-007\",\n MISSING_REQUIRED_TRANSITION: \"E-008\",\n INVALID_INPUT_CHAR: \"E-009\",\n INPUT_STATE_NOT_FOUND: \"E-010\",\n INVALID_TRANSITION_OBJECT: \"E-011\",\n DUPLICATE_TRANSITION_OBJECT: \"E-012\",\n INVALID_STATE_ARRAY: \"E-013\"\n});","import { ErrorCode } from \"../globals/errors\";\n\nexport class State {\n name: string;\n\n constructor(name: string) {\n this.name = name;\n if (!this.name) throw new Error(ErrorCode.INVALID_STATE_NAME);\n }\n}","import { type State } from \"../components/State\";\n\n// Count number of instances for each string in an array - returns key/val pairs\nexport const count = (names: string[]): Record<string, number> =>\n names.reduce((a, b) => Object.assign(a, { [b]: (a[b] || 0) + 1 }), {} as Record<string, number>);\n\n// Returns keys with value > 1\nexport const duplicates = (dict: Record<string, number>): string[] =>\n Object.keys(dict).filter(a => dict[a] > 1);\n\n// Equality function for Arrays containing primitive typed values\nexport const compare = (\n a1: Array<string | number | boolean>,\n a2: Array<string | number | boolean>\n): boolean => {\n const s1 = new Set(a1);\n const s2 = new Set(a2);\n return s1.size === s2.size && [...s1].every(v => s2.has(v));\n};\n\n// Check for duplicate keys in a Set<State> input\nexport const checkStateDuplicates = (states: Set<State>): boolean => {\n const check: Set<string> = new Set();\n for (const item of states) {\n if (check.has(item.name)) return true;\n check.add(item.name);\n }\n return false;\n};\n\nexport const getOrDefault = <K, V>(map: Map<K, V>, key: K, defaultValue: V): V => {\n const val = map.get(key);\n return val == null ? defaultValue : val;\n};\n\nconst getConstructorName = (obj: object): string | undefined => {\n try {\n const prototype = Object.getPrototypeOf(obj) as { constructor?: unknown } | null;\n const ctor = prototype?.constructor;\n return typeof ctor === \"function\" && typeof ctor.name === \"string\" && ctor.name.length > 0\n ? ctor.name\n : undefined;\n } catch {\n return undefined;\n }\n};\n\nexport const instanceOf = <T extends object, A extends unknown[]>(\n ctor: abstract new (...args: A) => T,\n obj: unknown\n): obj is T => {\n if (obj == null || (typeof obj !== \"object\" && typeof obj !== \"function\")) return false;\n\n try {\n if (obj instanceof ctor) return true;\n } catch {\n return false;\n }\n\n let ctorName: string | undefined;\n try {\n ctorName = typeof ctor.name === \"string\" && ctor.name.length > 0 ? ctor.name : undefined;\n } catch {\n return false;\n }\n\n return Boolean(ctorName) && ctorName === getConstructorName(obj);\n};\n\nexport const isSubsetOf = <T>(subset: Set<T>, superset: Set<T>): boolean => {\n for (const item of subset) {\n if (!superset.has(item)) return false;\n }\n return true;\n};\n\nexport const isSupersetOf = <T>(superset: Set<T>, subset: Set<T>): boolean => {\n return isSubsetOf(subset, superset);\n};","import { ErrorCode } from \"../globals/errors\";\nimport { count, duplicates } from \"../globals/globals\";\n\nexport class Alphabet {\n sigma: string[];\n\n constructor(sigma: string | string[]) {\n if (!Array.isArray(sigma)) {\n if (typeof sigma === \"string\") sigma = [...sigma];\n else throw new TypeError();\n }\n this.sigma = sigma;\n if (duplicates(count(this.sigma)).length > 0) throw new Error(ErrorCode.DUPLICATE_ALPHABET_VALS);\n }\n}","import { type State } from \"./State\";\n\nexport class NFATransition {\n origin: State;\n dest: State[];\n input: string;\n\n constructor(origin: State, dest: State[], input: string) {\n this.origin = origin;\n this.dest = dest;\n this.input = input;\n }\n}","import { type State } from \"./State\";\n\nexport class Transition {\n origin: State;\n dest: State;\n input: string;\n\n constructor(origin: State, dest: State, input: string) {\n this.origin = origin;\n this.dest = dest;\n this.input = input;\n }\n}","import { ErrorCode } from \"../globals/errors\";\nimport { type State, type Alphabet, Transition } from \"../components\";\nimport { DFA } from \"../automata\";\nimport { getOrDefault } from \"../globals/globals\";\n\nexport class DFAUtils {\n /*\n * Transition function should only contain states in Q, and one transition should exist\n * for each combination of Q x Σ\n */\n static validateTFunc(\n _states: Set<State>,\n _paths: Map<State, Set<string>>,\n _tfunc: Set<Transition>,\n _alph: Alphabet\n ): Set<Transition> {\n const newTFunc: Set<Transition> = new Set(); // Will contain only necessary transitions\n\n for (const _t of _tfunc) {\n // Check for valid states\n if (!_states.has(_t.origin)) {\n console.error(\"Origin state was invalid: %o\", JSON.stringify(_t.origin));\n throw new Error(ErrorCode.ORIGIN_STATE_NOT_FOUND);\n }\n if (!_states.has(_t.dest)) {\n console.error(\"Dest state was invalid: %o\", JSON.stringify(_t.dest));\n throw new Error(ErrorCode.DEST_STATE_NOT_FOUND);\n }\n\n const pathStateVals: Set<string> = getOrDefault(_paths, _t.origin, new Set());\n\n // Map transition to a path and remove on match\n if (this.isValidInputChar(_t.input, _alph)) {\n if (_paths.has(_t.origin) && pathStateVals.has(_t.input)) {\n newTFunc.add(_t);\n pathStateVals.delete(_t.input);\n if (pathStateVals.size === 0) {\n _paths.delete(_t.origin);\n }\n } else {\n throw new Error(ErrorCode.DUPLICATE_TRANSITION_OBJECT);\n }\n } else {\n throw new Error(ErrorCode.INVALID_INPUT_CHAR);\n }\n }\n\n if (_paths.size > 0) {\n console.error(\"Not all FSA paths have a transition specified:\");\n for (const [key, val] of _paths) {\n console.error(\"State %s on input(s): %s\", key.name, [...val].join(\" \"));\n }\n throw new Error(ErrorCode.MISSING_REQUIRED_TRANSITION);\n }\n\n return newTFunc;\n }\n\n static createPaths(_states: Set<State>, _alph: Alphabet): Map<State, Set<string>> {\n const _paths: Map<State, Set<string>> = new Map<State, Set<string>>();\n for (const state of _states) {\n for (const char of _alph.sigma) {\n const pathStateVals: Set<string> = getOrDefault(_paths, state, new Set());\n if (_paths.has(state)) pathStateVals.add(char);\n else _paths.set(state, new Set([char]));\n }\n }\n\n return _paths;\n }\n\n // Determine digraph order based on start state, then following the chain\n static determineStateOrder(\n _links: Map<string, Set<string>>,\n _tfunc: Set<Transition>,\n _states: Set<State>,\n _start: State,\n _accepts: Set<State>\n ): string[] {\n const statesOrder: string[] = []; // Ordered state names for digraph\n\n // Map origin state names to dest state names\n _links = new Map();\n for (const tr of _tfunc) {\n const linkStateVals: Set<string> = getOrDefault(_links, tr.origin.name, new Set());\n if (_links.has(tr.origin.name)) linkStateVals.add(tr.dest.name);\n else _links.set(tr.origin.name, new Set([tr.dest.name]));\n }\n\n // Populate state order\n this.parseLinks(statesOrder, _start.name, _links);\n\n // Check for dead states and reduce FSA if necessary\n const stateArr: string[] = [];\n (Object.values([..._states]) as State[]).map((state: State) => stateArr.push(state.name));\n const deadStates = stateArr.filter(x => !statesOrder.includes(x));\n if (deadStates.length > 0) {\n console.warn(\"Dead states detected, removing them and associated transitions: %O\", deadStates);\n this.removeDeadStates(deadStates, _states, _accepts, _tfunc);\n }\n\n return statesOrder;\n }\n\n // Reduce FSA by removing dead states and associated transitions\n static removeDeadStates(\n deadStates: string[],\n _states: Set<State>,\n _accepts: Set<State>,\n _tfunc: Set<Transition>\n ) {\n // Q\n for (const state of _states) {\n if (deadStates.indexOf(state.name) !== -1) _states.delete(state);\n }\n // F\n for (const state of _accepts) {\n if (deadStates.indexOf(state.name) !== -1) _accepts.delete(state);\n }\n // δ\n for (const tr of _tfunc) {\n if (deadStates.indexOf(tr.origin.name) !== -1 || deadStates.indexOf(tr.dest.name) !== -1) _tfunc.delete(tr);\n }\n }\n\n // Recursively parse graph while adding to an array in order, beginning with q0\n static parseLinks(arr: string[], name: string, _links: Map<string, Set<string>>) {\n arr.push(name);\n const nameVal = getOrDefault(_links, name, new Set<string>());\n for (const st of nameVal) {\n if (arr.indexOf(st) === -1) this.parseLinks(arr, st, _links);\n }\n }\n\n // DFA does not allow empty symbol\n static isValidInputChar(input: string, _alph: Alphabet): boolean {\n if (input === \"\") return false;\n return _alph.sigma.indexOf(input) !== -1;\n }\n}\n\nexport interface TransitionInput {\n from: string;\n to: string;\n input: string;\n}\n\n// Global export method for creating DFA\nexport const createDFA = (\n states: Map<string, State>,\n alphabet: Alphabet,\n transitions: TransitionInput[],\n start: State,\n accepts: Set<State>\n): InstanceType<typeof DFA> => {\n // Convert transition array to Set<Transition>\n const _tfunc: Set<Transition> = new Set();\n for (const tr of transitions) {\n if (!tr.from || !tr.to || !tr.input) throw new Error(ErrorCode.INVALID_TRANSITION_OBJECT);\n const fromVal: State = getOrDefault(states, tr.from, null as unknown as State);\n const toVal: State = getOrDefault(states, tr.to, null as unknown as State);\n _tfunc.add(new Transition(fromVal, toVal, tr.input));\n }\n return new DFA(new Set(states.values()), alphabet, _tfunc, start, accepts);\n};","import { DFAUtils } from \"./DFAUtils\";\nimport { NFA } from \"../automata\";\nimport { type State, type Transition, type Alphabet, NFATransition } from \"../components\";\nimport { ErrorCode } from \"../globals/errors\";\nimport { getOrDefault } from \"../globals/globals\";\nimport type { TransitionInput } from \"./DFAUtils\";\n\nexport class NFAUtils extends DFAUtils {\n // NFA inheritly allows for ε (empty string) transition if specified\n static isValidInputChar(input: string, _alph: Alphabet): boolean {\n return _alph.sigma.indexOf(input) !== -1 || input === \"\";\n }\n\n // Follow all ε transitions and add to `state` (origin states)\n static populateEpsilons(_tfunc: Set<Transition>, state: State[]): State[] {\n let cont = true; // continue\n while (cont) {\n cont = false;\n\n // Find all ε from origin set\n const epsTransitions: Transition[] = Array.from(_tfunc).filter(obj => {\n return state.includes(obj.origin) && obj.input === \"\";\n });\n\n // Add new states, break if no new states found\n for (const _t of epsTransitions) {\n if (!state.includes(_t.dest)) {\n state.push(_t.dest);\n cont = true;\n }\n }\n }\n return state;\n }\n\n // Validate tfunc according to NFA rules\n static validateTFunc(\n _states: Set<State>,\n _paths: Map<State, Set<string>>,\n _tfunc: Set<Transition>,\n _alph: Alphabet\n ): Set<Transition> {\n const newTFunc: Set<Transition> = new Set(); // Will contain only necessary transitions\n\n for (const _t of _tfunc) {\n let skip = false;\n\n // Check for valid states\n if (!_states.has(_t.origin)) {\n console.error(\"Origin state was invalid: %o\", JSON.stringify(_t.origin));\n throw new Error(ErrorCode.ORIGIN_STATE_NOT_FOUND);\n }\n if (!_states.has(_t.dest)) {\n console.error(\"Dest state was invalid: %o\", JSON.stringify(_t.dest));\n throw new Error(ErrorCode.DEST_STATE_NOT_FOUND);\n }\n\n // Check for duplicate before adding\n for (const _checkT of newTFunc) {\n if (_checkT.origin === _t.origin && _checkT.dest === _t.dest && _checkT.input === _t.input) skip = true;\n }\n\n // Map transition to a path and remove on match\n if (!skip) {\n if (_paths.has(_t.origin)) {\n if (this.isValidInputChar(_t.input, _alph)) {\n newTFunc.add(_t);\n } else {\n throw new Error(ErrorCode.INVALID_INPUT_CHAR);\n }\n }\n }\n }\n\n return newTFunc;\n }\n}\n\nexport const createNFA = (\n states: Map<string, State>,\n alphabet: Alphabet,\n transitions: TransitionInput[],\n start: State,\n accepts: Set<State>\n): InstanceType<typeof NFA> => {\n // Convert transition array to Set<NFATransition>\n const _tfunc: Set<NFATransition> = new Set();\n for (const tr of transitions) {\n if (!tr.from || !tr.to || (!tr.input && tr.input !== \"\"))\n throw new Error(ErrorCode.INVALID_TRANSITION_OBJECT);\n const fromVal: State = getOrDefault(states, tr.from, null as unknown as State);\n const toVal: string[] = tr.to.split(\",\");\n\n const destStates: State[] = [];\n toVal.forEach(_dest => {\n destStates.push(getOrDefault(states, _dest, null as unknown as State));\n });\n\n _tfunc.add(new NFATransition(fromVal, destStates, tr.input));\n }\n return new NFA(new Set(states.values()), alphabet, _tfunc, start, accepts);\n};","import { ErrorCode } from \"../globals/errors\";\nimport { instanceOf, getOrDefault } from \"../globals/globals\";\nimport { type FSA } from \"../interfaces/FSA\";\nimport { State, type Transition, Alphabet } from \"../components\";\nimport { type DFA, NFA } from \"../automata\";\nimport { DFAUtils, createDFA, type TransitionInput } from \"./DFAUtils\";\nimport { NFAUtils, createNFA } from \"./NFAUtils\";\n\nexport type { TransitionInput };\n\n/*\n * This class will take an input FSA constructor function\n * to determine which util methods need to be called\n */\nexport const FSAUtils = (() => {\n /*\n * Private methods\n */\n function receiveInputDFA(dfa: InstanceType<typeof DFA>, input: string, state: State): State {\n if (dfa.getAlphabet().sigma.indexOf(input) === -1) throw new Error(ErrorCode.INVALID_INPUT_CHAR);\n if (!dfa.getStates().has(state)) throw new Error(ErrorCode.INPUT_STATE_NOT_FOUND);\n\n const path = Array.from(dfa.getTFunc()).find(obj => {\n return obj.origin === state && obj.input === input;\n });\n\n if (path) return path.dest;\n else throw new Error(ErrorCode.INVALID_TRANSITION_OBJECT);\n }\n\n function receiveInputNFA(nfa: InstanceType<typeof NFA>, input: string, state: State[]): Set<State> {\n let path: Transition[] = [];\n if (nfa.getAlphabet().sigma.indexOf(input) === -1) throw new Error(ErrorCode.INVALID_INPUT_CHAR);\n\n // Empty transitions\n state = populateEpsilons(nfa.getTFunc(), state);\n\n // For ε input, return states already determined\n if (input === \"\") return new Set<State>(state);\n\n // Looking at all origin states, based on input char, determine set of destination states\n for (const _s of state) {\n const _addToPath: Transition[] = Array.from(nfa.getTFunc()).filter(obj => {\n return obj.origin === _s && obj.input === input;\n });\n\n path = path.concat(_addToPath);\n }\n\n const resultArr: State[] = [];\n if (path.length > 1) {\n for (const _s of path) resultArr.push(_s.dest);\n } else if (path.length === 1) {\n resultArr.push(path[0].dest);\n } else {\n // No valid transition found, returning empty set\n return new Set<State>();\n }\n\n // Empty transitions on result set\n const retSet: Set<State> = new Set<State>(populateEpsilons(nfa.getTFunc(), resultArr));\n\n return retSet;\n }\n\n function populateEpsilons(_tfunc: Set<Transition>, state: State[]): State[] {\n return NFAUtils.populateEpsilons(_tfunc, state);\n }\n\n class FSAUtils {\n _type: typeof DFA | typeof NFA;\n\n constructor(v: typeof DFA | typeof NFA) {\n this._type = v;\n }\n\n receiveInput(fsa: FSA, input: string, state: State | State[]): State | Set<State> {\n if (instanceOf(NFA, fsa)) {\n if (instanceOf(State, state)) return receiveInputNFA(fsa as InstanceType<typeof NFA>, input, [state]);\n else return receiveInputNFA(fsa as InstanceType<typeof NFA>, input, state);\n } else {\n if (Array.isArray(state)) {\n if (state.length > 1) {\n console.error(\"State array can only contain one state for DFAs\");\n throw new Error(ErrorCode.INVALID_STATE_ARRAY);\n } else {\n state = state[0];\n }\n }\n return receiveInputDFA(fsa as InstanceType<typeof DFA>, input, state);\n }\n }\n\n validateTFunc(\n _states: Set<State>,\n _paths: Map<State, Set<string>>,\n _tfunc: Set<Transition>,\n _alph: Alphabet\n ): Set<Transition> {\n if (this._type === NFA) {\n return NFAUtils.validateTFunc(_states, _paths, _tfunc, _alph);\n } else {\n return DFAUtils.validateTFunc(_states, _paths, _tfunc, _alph);\n }\n }\n\n createPaths(_states: Set<State>, _alph: Alphabet): Map<State, Set<string>> {\n return DFAUtils.createPaths(_states, _alph);\n }\n\n determineStateOrder(\n _links: Map<string, Set<string>>,\n _tfunc: Set<Transition>,\n _states: Set<State>,\n _start: State,\n _accepts: Set<State>\n ): string[] {\n return DFAUtils.determineStateOrder(_links, _tfunc, _states, _start, _accepts);\n }\n }\n\n return FSAUtils;\n})();\n\n// Global export method for creating FSA\nexport const createFSA = (\n states: string | string[],\n alphabet: string | string[],\n transitions: TransitionInput | TransitionInput[],\n start: string,\n accepts: string | string[]\n): FSA => {\n // Type check and conversion for states\n const _states: Map<string, State> = new Map();\n if (typeof states === \"string\") {\n _states.set(states, new State(states));\n } else if (Array.isArray(states)) {\n for (const state of states) {\n if (!_states.has(state)) _states.set(state, new State(state));\n }\n } else {\n throw new TypeError(String(states));\n }\n\n // Convert remaining inputs\n const _alphabet = new Alphabet(alphabet);\n if (typeof start !== \"string\") throw new TypeError(String(start));\n const _start: State = getOrDefault(_states, start, null as unknown as State);\n\n const _accepts: Set<State> = new Set();\n if (typeof accepts === \"string\") {\n if (_states.has(accepts)) _accepts.add(getOrDefault(_states, accepts, null as unknown as State));\n } else if (Array.isArray(accepts)) {\n for (const state of accepts) {\n _accepts.add(getOrDefault(_states, state, null as unknown as State));\n }\n } else {\n throw new TypeError(String(accepts));\n }\n\n /*\n * Determine, based on tfunc structure, whether to create a DFA or NFA\n * If the \"to\" field of any member of the tfunc object is comma separated, or any input\n * char is \"\", then create an NFA\n */\n let transitionList: TransitionInput[];\n if (!Array.isArray(transitions) && typeof transitions === \"object\") transitionList = [transitions];\n else if (Array.isArray(transitions)) transitionList = transitions;\n else throw new TypeError(String(transitions));\n\n for (const tr of transitionList) {\n if (tr.to.indexOf(\",\") != -1 || tr.input === \"\")\n return createNFA(_states, _alphabet, transitionList, _start, _accepts);\n }\n return createDFA(_states, _alphabet, transitionList, _start, _accepts);\n};","import { type FSA } from \"../interfaces/FSA\";\nimport { type State, type Alphabet, type Transition } from \"../components\";\nimport { ErrorCode } from \"../globals/errors\";\nimport { checkStateDuplicates, getOrDefault, isSubsetOf } from \"../globals/globals\";\nimport { FSAUtils } from \"../utils\";\n\nexport class DFA implements FSA {\n // Primary FSA attributes\n #states: Set<State>;\n #alphabet: Alphabet;\n #tfunc: Set<Transition>;\n #start: State;\n #accepts: Set<State>;\n\n // Intermediary attributes used in constructor\n #paths: Map<State, Set<string>>; // States mapped to each member of Σ, will be empty after constructor returns\n #links: Map<string, Set<string>> = new Map(); // State names mapped to their dest state names\n #utils: InstanceType<typeof FSAUtils>;\n\n constructor(\n states: Set<State>,\n alphabet: Alphabet,\n tfunc: Set<Transition>,\n start: State,\n accepts: Set<State> | Record<string, never>\n ) {\n // initialize utils\n this.#utils = new FSAUtils(this.constructor as typeof DFA);\n\n // states validations\n if (checkStateDuplicates(states)) throw new Error(ErrorCode.DUPLICATE_STATE_NAMES);\n this.#states = states;\n\n this.#alphabet = alphabet;\n\n // Create paths map\n this.#paths = this.#utils.createPaths(this.#states, this.#alphabet);\n\n // Start/Accept validations\n if (!states.has(start)) throw new Error(ErrorCode.START_STATE_NOT_FOUND);\n this.#start = start;\n if (Object.keys(accepts).length === 0 && accepts.constructor === Object) accepts = new Set([]); // Allow for {}\n if (!isSubsetOf(accepts as Set<State>, states)) throw new Error(ErrorCode.ACCEPTS_NOT_SUBSET);\n this.#accepts = accepts as Set<State>;\n\n // TFunc validations\n this.#tfunc = this.#utils.validateTFunc(this.#states, this.#paths, tfunc, this.#alphabet);\n }\n\n /*\n * Getters\n */\n getStates(): Set<State> {\n return this.#states;\n }\n getAlphabet(): Alphabet {\n return this.#alphabet;\n }\n getTFunc(): Set<Transition> {\n return this.#tfunc;\n }\n getStartState(): State {\n return this.#start;\n }\n getAcceptStates(): Set<State> {\n return this.#accepts;\n }\n getType(): string {\n return \"DFA\";\n }\n\n generateDigraph(): string {\n // Prep outputs\n const acceptArr: string[] = [];\n for (const state of this.#accepts) acceptArr.push(state.name);\n\n // Duplicate origin/dest combinations should share a line\n const pairs: Map<string, string> = new Map();\n (Object.values([...this.#tfunc]) as Transition[]).map(function (t: Transition) {\n const key: string = t.origin.name + t.dest.name;\n let _input: string = t.input;\n if (_input === \"\") _input = \"ε\";\n if (!pairs.has(key)) {\n pairs.set(key, t.origin.name + \" -> \" + t.dest.name + ' [ label = \"' + _input + '\" ];');\n } else {\n /*\n * To edit an existing line, split out the input(s), convert to number, sort them ascending, and add the new one\n */\n let _line: string = getOrDefault(pairs, key, \"\");\n const _oldinput: string = _line.split('\"')[1];\n const _toAdd: string[] = _oldinput.split(\",\");\n _toAdd.push(_input);\n _toAdd.sort();\n _line = _line.replace('\"' + _oldinput + '\"', '\"' + _toAdd.toString() + '\"');\n pairs.set(key, _line);\n }\n });\n\n // return template literal\n return `digraph fsa {\n ${(Object.values(\n this.#utils.determineStateOrder(this.#links, this.#tfunc, this.#states, this.#start, this.#accepts)\n ) as string[])\n .map(function (str: string) {\n if (acceptArr.indexOf(str) !== -1) return str + \" [shape = doublecircle];\";\n else return str;\n })\n .join(\"\\n\\t\")}\n rankdir=LR;\n node [shape = point ]; qi;\n node [shape = circle];\n qi -> ${this.#start.name};\n ${(Object.values([...pairs]) as [string, string][])\n .map(function ([, val]) {\n return val;\n })\n .join(\"\\n\\t\")}\n }\n `;\n }\n}","import { DFA } from \"./DFA\";\nimport { type State, type Alphabet, type NFATransition, Transition } from \"../components\";\n\nexport class NFA extends DFA {\n constructor(\n states: Set<State>,\n alphabet: Alphabet,\n tfunc: Set<NFATransition>,\n start: State,\n accepts: Set<State> | Record<string, never>\n ) {\n // Implicitly add ε to alphabet\n if (!alphabet.sigma.includes(\"\")) alphabet.sigma.push(\"\");\n\n // If NFATransition has multiple dest states, break them up into separate Transitions\n const expandedTfunc: Set<Transition> = new Set<Transition>();\n for (const _t of tfunc) {\n _t.dest.forEach(_dest => {\n expandedTfunc.add(new Transition(_t.origin, _dest, _t.input));\n });\n }\n\n super(states, alphabet, expandedTfunc, start, accepts);\n }\n\n getType(): string {\n return \"NFA\";\n }\n}","import { type FSA } from \"../interfaces/FSA\";\nimport { State } from \"../components/State\";\nimport { DFA, NFA } from \"../automata\";\nimport { FSAUtils } from \"../utils\";\nimport { ErrorCode } from \"../globals/errors\";\nimport { instanceOf } from \"../globals/globals\";\n\nexport const simulateFSA = (\n w: string | string[],\n fsa: FSA,\n logging: boolean = false,\n returnEndState: boolean = false\n): boolean | string | string[] => {\n if (instanceOf(NFA, fsa)) {\n return simulateNFA(w, fsa as InstanceType<typeof NFA>, new FSAUtils(NFA), logging, returnEndState);\n } else {\n return simulateDFA(w, fsa as InstanceType<typeof DFA>, new FSAUtils(DFA), logging, returnEndState);\n }\n};\n\nexport const stepOnceFSA = (\n w: string,\n qin: string | string[],\n fsa: FSA,\n logging: boolean = false\n): string | string[] => {\n if (typeof w !== \"string\") {\n if (logging) console.error(\"Input w was invalid type: %O\", w);\n throw new TypeError();\n }\n if (typeof qin !== \"string\" && !Array.isArray(qin)) {\n if (logging) console.error(\"Input state was invalid type: %O\", qin);\n throw new TypeError();\n }\n\n // Step once\n if (logging) console.log(\"Input Processing Started\");\n let prevState: State | State[] = [];\n if (typeof qin === \"string\") {\n for (const state of fsa.getStates().values()) {\n if (qin === state.name) prevState = state;\n }\n if (!prevState || (Array.isArray(prevState) && prevState.length === 0))\n throw new Error(ErrorCode.INVALID_STATE_NAME);\n } else {\n prevState = [];\n for (const state of fsa.getStates().values()) {\n if (qin.includes(state.name)) prevState.push(state);\n }\n if (prevState.length !== qin.length) {\n throw new Error(ErrorCode.INVALID_STATE_NAME);\n }\n }\n\n let newState: State | State[];\n if (instanceOf(NFA, fsa)) newState = [...(new FSAUtils(NFA).receiveInput(fsa, w, prevState) as Set<State>)];\n else newState = new FSAUtils(DFA).receiveInput(fsa, w, prevState) as State;\n\n if (logging) console.log(\"%o x '%s' -> %o\", JSON.stringify(prevState), w, JSON.stringify(newState));\n if (logging) console.log(\"Input Processing Ended\");\n\n if (instanceOf(State, newState)) return newState.name;\n else {\n const retArray: string[] = [];\n for (const _s of newState) {\n retArray.push(_s.name);\n }\n return retArray;\n }\n};\n\n/*\n * Private methods\n */\nfunction simulateDFA(\n w: string | string[],\n dfa: InstanceType<typeof DFA>,\n utils: InstanceType<typeof FSAUtils>,\n logging: boolean,\n returnEndState: boolean\n): boolean | string {\n if (logging) console.log(\"Beginning DFA Simulation\");\n\n //Accept either string or string[] for w\n if (!Array.isArray(w)) {\n if (typeof w === \"string\") w = [...w];\n else {\n if (logging) console.error(\"Input w was invalid type: %O\", w);\n throw new TypeError();\n }\n }\n\n // Step through the DFA\n if (logging) console.log(\"Input Processing Started\");\n let currentState: State = dfa.getStartState();\n for (const char of w) {\n const prevState: State = currentState;\n currentState = utils.receiveInput(dfa, char, prevState) as State;\n if (logging) console.log(\"%o x '%s' -> %o\", JSON.stringify(prevState), char, JSON.stringify(currentState));\n }\n if (logging) console.log(\"Input Processing Ended\");\n\n // Check for acceptance\n if (dfa.getAcceptStates().has(currentState)) {\n if (logging) console.log(\"Input Accepted!\");\n if (returnEndState) return currentState.name;\n else return true;\n } else {\n if (logging) console.log(\"Input Rejected!\");\n if (returnEndState) return currentState.name;\n else return false;\n }\n}\n\nfunction simulateNFA(\n w: string | string[],\n nfa: InstanceType<typeof NFA>,\n utils: InstanceType<typeof FSAUtils>,\n logging: boolean,\n returnEndState: boolean\n): boolean | string[] {\n if (logging) console.log(\"Beginning NFA Simulation\");\n\n //Accept either string or string[] for w\n if (!Array.isArray(w)) {\n if (typeof w === \"string\") {\n if (w === \"\") w = [\"\"];\n else w = [...w];\n } else {\n if (logging) console.error(\"Input w was invalid type: %O\", w);\n throw new TypeError();\n }\n }\n\n if (logging) console.log(\"Input Processing Started\");\n let currentState: State[] = [nfa.getStartState()];\n for (const char of w) {\n const prevState: State[] = currentState;\n currentState = [...(utils.receiveInput(nfa, char, currentState) as Set<State>)];\n if (logging) console.log(\"%o x '%s' -> %o\", JSON.stringify(prevState), char, JSON.stringify(currentState));\n }\n if (logging) console.log(\"Input Processing Ended\");\n\n /*\n * Check for acceptance or rejection.\n * If returnEndState:\n * If accept, return all final accept states.\n * If reject, return all final states or if no final state return empty string\n */\n const retObj: string[] = [];\n for (const _accState of nfa.getAcceptStates()) {\n if (currentState.includes(_accState)) {\n if (!returnEndState) {\n if (logging) console.log(\"Input Accepted!\");\n return true;\n }\n retObj.push(_accState.name);\n }\n }\n if (retObj.length > 0) {\n if (logging) console.log(\"Input Accepted!\");\n return retObj;\n }\n\n if (logging) console.log(\"Input Rejected!\");\n if (returnEndState) {\n if (currentState.length > 0) {\n for (const _cState of currentState) retObj.push(_cState.name);\n }\n return retObj;\n } else {\n return false;\n }\n}"],"mappings":"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","names":["modules_exports","__export","createFSA","simulateFSA","stepOnceFSA","ErrorCode","State","name","ErrorCode","count","names","a","b","duplicates","dict","checkStateDuplicates","states","check","item","getOrDefault","map","key","defaultValue","val","getConstructorName","obj","ctor","instanceOf","ctorName","isSubsetOf","subset","superset","Alphabet","sigma","duplicates","count","ErrorCode","NFATransition","origin","dest","input","Transition","origin","dest","input","DFAUtils","_states","_paths","_tfunc","_alph","newTFunc","_t","ErrorCode","pathStateVals","getOrDefault","key","val","state","char","_links","_start","_accepts","statesOrder","tr","linkStateVals","stateArr","deadStates","x","arr","name","nameVal","st","input","createDFA","states","alphabet","transitions","start","accepts","fromVal","toVal","Transition","DFA","NFAUtils","DFAUtils","input","_alph","_tfunc","state","cont","epsTransitions","obj","_t","_states","_paths","newTFunc","skip","ErrorCode","_checkT","createNFA","states","alphabet","transitions","start","accepts","tr","fromVal","getOrDefault","toVal","destStates","_dest","NFATransition","NFA","FSAUtils","receiveInputDFA","dfa","input","state","ErrorCode","path","obj","receiveInputNFA","nfa","populateEpsilons","_s","_addToPath","resultArr","_tfunc","NFAUtils","v","fsa","instanceOf","NFA","State","_states","_paths","_alph","DFAUtils","_links","_start","_accepts","createFSA","states","alphabet","transitions","start","accepts","_alphabet","Alphabet","getOrDefault","transitionList","tr","createNFA","createDFA","_states","_alphabet","_tfunc","_start","_accepts","_paths","_links","_utils","DFA","states","alphabet","tfunc","start","accepts","__privateAdd","__privateSet","FSAUtils","checkStateDuplicates","ErrorCode","__privateGet","isSubsetOf","acceptArr","state","pairs","t","key","_input","_line","getOrDefault","_oldinput","_toAdd","str","val","NFA","DFA","states","alphabet","tfunc","start","accepts","expandedTfunc","_t","_dest","Transition","simulateFSA","w","fsa","logging","returnEndState","instanceOf","NFA","simulateNFA","FSAUtils","simulateDFA","DFA","stepOnceFSA","qin","prevState","state","ErrorCode","newState","State","retArray","_s","dfa","utils","currentState","char","nfa","retObj","_accState","_cState"]}