• Jump To … +
    Either.js List.js Maybe.js Set.js Stream.js Thunk.js Tuple.js boolean.js char.js base.js extra.js fold.js map.js zipWith.js collection.js control.js curried.js eq.js floating.js fractional.js function.js integral.js match.js num.js numeric.js object.js ord.js realfrac.js register.js string.js type.js nodash.js
  • extra.js

  • ¶
    /* vim: set et sw=2 ts=2: */
    'use strict';
    
    module.exports = [ 'List', 'Thunk', 'emptyList', 'isUndefined', 'listToArray', 'typeOf', 'error',
      function (List, Thunk, emptyList, isUndefined, listToArray, typeOf, error) {
    
      var Nodash = this;
    
      var sjt = require('steinhaus-johnson-trotter');
    
      function generateList(thing) {
        var generator = sjt(thing);
    
        function gen() {
          return new Thunk(function () {
            var next = generator();
            if (isUndefined(next)) {
              return emptyList();
            }
            return new List(next, gen());
          });
        }
    
        return new List(thing, gen());
      }
    
      return {
    
        permutations: function (thing) {
          switch (typeOf(thing)) {
            case 'array':
            case 'string':
              return sjt.all(thing);
            case 'list':
              return generateList(listToArray(thing));
            default:
              error(TypeError);
          }
        }
    
      };
      
    }];