# Implementing a new parent: a tutorial#

The easiest approach for implementing a new parent is to start from a close example in sage.categories.examples. Here, we will get through the process of implementing a new finite semigroup, taking as starting point the provided example:

```
sage: S = FiniteSemigroups().example()
sage: S
An example of a finite semigroup: the left regular band generated by ('a', 'b', 'c', 'd')
```

You may lookup the implementation of this example with:

```
sage: S?? # not tested
```

Or by browsing the source code of
`sage.categories.examples.finite_semigroups.LeftRegularBand`

.

Copy-paste this code into, say, a cell of the notebook, and replace
every occurrence of `FiniteSemigroups().example(...)`

in the
documentation by `LeftRegularBand`

. This will be equivalent to:

```
sage: from sage.categories.examples.finite_semigroups import LeftRegularBand
```

Now, try:

```
sage: S = LeftRegularBand(); S
An example of a finite semigroup: the left regular band generated by ('a', 'b', 'c', 'd')
```

and play around with the examples in the documentation of `S`

and of
`FiniteSemigroups`

.

Rename the class to `ShiftSemigroup`

, and modify the product to
implement the semigroup generated by the given alphabet such that \(au
= u\) for any \(u\) of length \(3\).

Use `TestSuite`

to test the newly implemented semigroup; draw its
Cayley graph.

Add another option to the constructor to generalize the construction to any u of length \(k\).

Lookup the Sloane for the sequence of the sizes of those semigroups.

Now implement the commutative monoid of subsets of \(\{1,\dots,n\}\) endowed with union as product. What is its category? What are the extra functionalities available there? Implement iteration and cardinality.

Todo

The tutorial should explain there how to reuse the enumerated set of subsets, and endow it with more structure.