Giter VIP home page Giter VIP logo

behavioral's Introduction

behavioral

Exports

  • selectionStrategies: callback functions (randomizedStrategy, chaosStrategy, priorityStrategy)
  • baseDynamics: constants (objectObject, objectPerson, personPerson)
  • streamEvents: constant (trigger, select, state)
  • Track: Class used to init a behavioral program
  • strand: function used to define a set of behavioral program rule
  • loop: function used to define conditions by which a a strand rule will continue to execute

Usage: tic-tac-toe

import {
  Track,
  baseDynamics,
  loop,
  strand,
  waitFor,
  request,
  block,
  randomizedStrategy,
  RulesFunc,
} from './src/index'

const winConditions = [
  //rows
  [0, 1, 2],
  [3, 4, 5],
  [6, 7, 8],
  // columns
  [0, 3, 6],
  [1, 4, 7],
  [2, 5, 8],
  // diagonals
  [0, 4, 8],
  [2, 4, 6],
]

const squares = [0, 1, 2, 3, 4, 5, 6, 7, 8]
const squaresTaken = squares.reduce((acc: Record<string, RulesFunc>, square) => {
  acc[`(${square}) taken`] = strand(
    waitFor({callback: ({payload}) => square === payload}),
    block({callback: ({payload}) => square === payload}),
  )

  return acc
}, {})

const playerWins = (player: string) =>
  winConditions.reduce((acc: Record<string, RulesFunc>, win) => {
    acc[`${player}Wins (${win})`] = strand(
      waitFor({
        callback: ({eventName, payload}) =>
          eventName === player && win.includes(payload),
      }),
      waitFor({
        callback: ({eventName, payload}) =>
          eventName === player && win.includes(payload),
      }),
      waitFor({
        callback: ({eventName, payload}) =>
          eventName === player && win.includes(payload), 
      }),
      request({eventName: `${player} Wins`, payload: win}),
    )
    return acc
  }, {})

const enforceTurns = loop(
  strand(
    Object.assign(waitFor({eventName: 'X'}), block({eventName: 'O'})),
    Object.assign(waitFor({eventName: 'O'}), block({eventName: 'X'})),
  ),
)

const playerMove = (player: string) =>
  loop(
    strand({
      request: squares.map(move => ({eventName: player, payload: move})),
    }),
  )

const stopGame = strand(
  waitFor({eventName: 'X Wins'},{eventName: 'O Wins'}),
  block({eventName: 'X'}, {eventName: 'O'}),
)

const strands = {
  stopGame,
  ...squaresTaken,
  enforceTurns,
  ...playerWins('X'),
  ...playerWins('O'),
}

const xStrands = {
  ...strands,
  xMoves: playerMove('X'),
}

const oStrands = {
  ...strands,
  oMoves: playerMove('O'),
}

const {trigger: xTrigger, feedback: xFeedback} = new Track(xStrands, {strategy: randomizedStrategy})

const {trigger: oTrigger, feedback: oFeedback} = new Track(oStrands, {strategy: randomizedStrategy})
const xActions = {
  X(payload: unknown){
    console.log({eventName: 'X', payload})
    oTrigger({
      eventName: 'X',
      payload: payload,
      baseDynamic: baseDynamics.objectObject,
    })
  },
  ['X Wins'](payload: unknown){
    console.log({eventName: 'X Wins', payload})
  },
}
xFeedback(xActions)

const oActions = {
  O(payload: unknown){
    console.log({eventName: 'O', payload})
    xTrigger({
      eventName: 'O',
      payload: payload,
      baseDynamic: baseDynamics.objectObject,
    })
  },
  ['O Wins'](payload: unknown){
    console.log({eventName: 'O Wins', payload})
  },
}
oFeedback(oActions)

xTrigger({eventName: 'start', baseDynamic: baseDynamics.objectObject})

behavioral's People

Contributors

edwardirby avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.