ordered-char-combinations

2.0.0 • Public • Published

ordered-char-combinations Join the chat at https://gitter.im/ZenyWay/ordered-char-combinations

NPM build status coverage status Dependency Status

iterable over ordered character combinations from a list of alphabets.

breaking change notice

in view of enhancing this module's features, starting with API 2.0, the original imperative O-O implementation is replaced with a more trivial and more powerful functional equivalent, a slightly simplified version of which follows for illustration purposes:

import { Stream, from as stream } from 'most'
 
export function combination$ (alphabet$: Iterable<string>|Stream<string>): Stream<string> {
  const char$ = stream<string>(alphabet$)
  const char$$ = char$.map(alphabet => stream<string>(alphabet))
  const length = char$.constant(1).reduce(sum, 0)
 
  return unwrap(length.then(length =>
    char$$.skip(1)
    .scan(combine, char$$.take(1).join())
    .slice(length - 1)
    .join()))
}
 
function combine (combination$: Stream<string>, char$: Stream<string>): Stream<string> {
  return combination$
  .flatMap(combination => char$.map(char => combination + char))
}
 
function sum (a: number, b: number): number {
  return a + b
}
 
function unwrap <T> (promise: Promise<Stream<T>>): Stream<T> {
  return fromPromise(promise).join()
}

the above functional implementation is more powerful than the original imperative O-O implementation:

  • it takes streams, observables or any other iterables as input, not only arrays,
  • and it exposes the complete stream interface from most, not only skip.

example

a live version of this example can be viewed here in the browser console, or by cloning this repository and running the following commands from a terminal:

npm install
npm run example

the files of this example are available here.

import combination$ from 'ordered-char-combinations'
import debug = require('debug')
const log = debug('example')
 
const string$ = combination$([ 'abc', 'ABC', '012' ])
const subset$ = string$.skip(15).take(5)
 
subset$.forEach(log) // 'bC0', 'bC1', 'bC2', 'cA0', 'cA1'

API v2.0 stable

ES5 and Typescript compatible. coded in Typescript 2, transpiled to ES5.

for a detailed specification of the API, run the unit tests in your browser.

CONTRIBUTING

see the contribution guidelines

LICENSE

Copyright 2016 Stéphane M. Catala

Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and Limitations under the License.

Package Sidebar

Install

npm i ordered-char-combinations

Weekly Downloads

6

Version

2.0.0

License

SEE LICENSE IN LICENSE

Last publish

Collaborators

  • smcatala