<commit_before># plusnew [![Build Status](	https://img.shields.io/travis/plusnew/plusnew.svg?maxAge=0)](https://travis-ci.org/plusnew/plusnew) [![Coverage Status](https://img.shields.io/coveralls/github/plusnew/plusnew.svg?maxAge=0)](https://coveralls.io/github/plusnew/plusnew)

A typesecure framework for managing your components.
The Framework has a immutable statehandling approach, which allows easy timetraveling.

A Component can get data by it's props, and by unlimited internal and external stores.
This avoids nesting the component in containers for i18n and others.

```ts
import plusnew, { component, store } from 'plusnew';
import Counter from './Counter';

type actions = { type: "store::init" | "increment" };
type props = {};

const reducer = (state: number | null, action: actions) => {
  if (state === null) {
    return 0;
  } else if (action.type === "increment") {
    return ++state;
  }
  return state;
};

const component: component<props> = () => {
  const local = store(reducer);

  return {
    dependencies: { local },
    render: (props: props) => (
      <div>
        <button
          onClick={(evt: KeyboardEvent) => {
            local.dispatch({ type: "increment" });
          }}
        />
        <Counter value={local.state} />
      </div>
    )
  };
};

export default component;

```<commit_msg>[readme] made it looking better<commit_after># plusnew [![Build Status](	https://img.shields.io/travis/plusnew/plusnew.svg?maxAge=0)](https://travis-ci.org/plusnew/plusnew) [![Coverage Status](https://img.shields.io/coveralls/github/plusnew/plusnew.svg?maxAge=0)](https://coveralls.io/github/plusnew/plusnew)

A typesecure framework for managing your components.
The Framework has a immutable statehandling approach, which allows easy timetraveling.

A Component can get data by it's props, and by unlimited internal and external stores.
This avoids nesting the component in containers for i18n and others.

```ts
import plusnew, { component, store } from 'plusnew';
import Counter from './Counter';

type actions = { type: 'store::init' | 'increment' };
type props = {};

const reducer = (state: number | null, action: actions) => {
  if (state === null) {
    return 0;
  } else if (action.type === 'increment') {
    return state + 1;
  }
  return state;
};

const component: component<props> = () => {
  const local = store(reducer);

  return {
    dependencies: { local },
    render: (props: props) => (
      <div>
        <button
          onClick={(evt: KeyboardEvent) => {
            local.dispatch({ type: 'increment' });
          }}
        />
        <Counter value={local.state} />
      </div>
    ),
  };
};

export default component;

```
{'fraction_non_alphanumeric': 0.14842300556586271, 'fraction_numerical': 0.004081632653061225, 'mean_word_length': 3.383739837398374, 'pattern_counts': {'":': 0, '<': 13, '<?xml version=': 0, '>': 21, 'https://': 8, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '6009284', 'n_tokens_mistral': 856, 'n_tokens_neox': 823, 'n_words': 233}