Skip to content

Commit

Permalink
Refactor
Browse files Browse the repository at this point in the history
  • Loading branch information
julianpeeters committed Jan 25, 2024
1 parent 5ea442a commit 125404c
Show file tree
Hide file tree
Showing 13 changed files with 448 additions and 385 deletions.
2 changes: 1 addition & 1 deletion modules/fs2/shared/src/main/scala/dynamical/stream.scala
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ package dynamical.stream

import fs2.Pipe
import dynamical.fsm.Mealy
import dynamical.fsm.internal.Unify2
import dynamical.fsm.methods.types.Unify2
import polynomial.morphism.~>
import polynomial.`object`.{Binomial, Monomial}

Expand Down
62 changes: 6 additions & 56 deletions modules/fsm/shared/src/main/scala/dynamical/fsm/Mealy.scala
Original file line number Diff line number Diff line change
@@ -1,16 +1,19 @@
package dynamical.fsm

import dynamical.fsm.internal.{Init, Readout, Run, Update}
import dynamical.fsm.run.Runner2
import dynamical.fsm.methods.types.Run
import dynamical.fsm.methods.mealy.run.Runner2
import dynamical.fsm.methods.polymap.asMealy.asMealy
import polynomial.morphism.{PolyMap, ~>}
import polynomial.`object`.{Binomial, Monomial}
import polynomial.product.


trait Mealy[P[_]] extends Moore[P]:
def run[Y]: Run[P, Y]

object Mealy:

export dynamical.fsm.methods.mealy.product.tensor.*

def apply[S, A, B, Y](
i: S,
r: S => A => B,
Expand All @@ -28,56 +31,3 @@ object Mealy:
using Runner2[Monomial.Store[S, _] ~> Binomial.Interface[A1, A1 => B1, A2, A2 => B2, _], S, A1, B1, A2, B2]
): Mealy[Monomial.Store[S, _] ~> Binomial.Interface[A1, A1 => B1, A2, A2 => B2, _]] =
PolyMap[Monomial.Store[S, _], Binomial.Interface[A1, A1 => B1, A2, A2 => B2, _], Y]((r1, r2), (u1, u2)).asMealy(i)

extension [S1, S2, A1, B1, A2, B2, Y] (m1: Mealy[Monomial.Store[S1, _] ~> Monomial.Interface[A1, A1 => B1, _]])
@scala.annotation.targetName("tensor1")
def (m2: Mealy[Monomial.Store[S2, _] ~> Monomial.Interface[A2, A2 => B2, _]]): Mealy[(Monomial.Store[S1, _]) ⊗ (Monomial.Store[S2, _]) ~> (Monomial.Interface[A1, A1 => B1, _] ⊗ Monomial.Interface[A2, A2 => B2, _])] =
new Mealy[(Monomial.Store[S1, _]) ⊗ (Monomial.Store[S2, _]) ~> (Monomial.Interface[A1, A1 => B1, _] ⊗ Monomial.Interface[A2, A2 => B2, _])]:
def init[Y]: Init[(Monomial.Store[S1, _]) ⊗ (Monomial.Store[S2, _]) ~> (Monomial.Interface[A1, A1 => B1, _] ⊗ Monomial.Interface[A2, A2 => B2, _]), Y] =
(m1.init, m2.init)
def readout[Y]: Readout[(Monomial.Store[S1, _]) ⊗ (Monomial.Store[S2, _]) ~> (Monomial.Interface[A1, A1 => B1, _] ⊗ Monomial.Interface[A2, A2 => B2, _]), Y] =
(s1, s2) => (m1.readout(s1), m2.readout(s2))
def update[Y]: Update[(Monomial.Store[S1, _]) ⊗ (Monomial.Store[S2, _]) ~> (Monomial.Interface[A1, A1 => B1, _] ⊗ Monomial.Interface[A2, A2 => B2, _]), Y] =
(s, a) => (m1.update(s._1, a._1), m2.update(s._2, a._2))
def run[Y]: Run[(Monomial.Store[S1, _]) ⊗ (Monomial.Store[S2, _]) ~> ((Monomial.Interface[A1, A1 => B1, _]) ⊗ (Monomial.Interface[A2, A2 => B2, _])), Y] =
(s, a) => (update(s, a), (readout(s)._1(a._1), readout(s)._2(a._2)))

extension [S, A, B, Y] (p: PolyMap[Monomial.Store[S, _], Monomial.Interface[A, A => B, _], Y])
@scala.annotation.targetName("asMealyStoreToMono")
def asMealy(i: S): Mealy[Monomial.Store[S, _] ~> Monomial.Interface[A, A => B, _]] =
new Mealy[Monomial.Store[S, _] ~> Monomial.Interface[A, A => B, _]]:
def init[Y]: Init[(Monomial.Store[S, _]) ~> Monomial.Interface[A, A => B, _], Y] =
i
def readout[Y]: Readout[(Monomial.Store[S, _]) ~> (Monomial.Interface[A, A => B, _]), Y] =
p.φ
def update[Y]: Update[(Monomial.Store[S, _]) ~> (Monomial.Interface[A, A => B, _]), Y] =
p.`φ#`
def run[Y]: Run[(Monomial.Store[S, _]) ~> (Monomial.Interface[A, A => B, _]), Y] =
(s: S, a: A) => (p.`φ#`(s, a), p.φ(s)(a))

extension [S, A, B, Y] (p: (Monomial.Store[S, _] ~> Monomial.Interface[A, B, _] ~> Monomial.Interface[A, A => B, _])[Y])
@scala.annotation.targetName("asMealyStoreToMonoToMono")
def asMealy(i: S): Mealy[Monomial.Store[S, _] ~> Monomial.Interface[A, B, _] ~> Monomial.Interface[A, A => B, _]] =
new Mealy[Monomial.Store[S, _] ~> Monomial.Interface[A, B, _] ~> Monomial.Interface[A, A => B, _]]:
def init[Y]: Init[Monomial.Store[S, _] ~> Monomial.Interface[A, B, _] ~> Monomial.Interface[A, A => B, _], Y] =
i
def readout[Y]: Readout[Monomial.Store[S, _] ~> Monomial.Interface[A, B, _] ~> Monomial.Interface[A, A => B, _], Y] =
p.φ
def update[Y]: Update[(Monomial.Store[S, _] ~> Monomial.Interface[A, B, _] ~> Monomial.Interface[A, A => B, _]), Y] =
p.`φ#`
def run[Y]: Run[(Monomial.Store[S, _]) ~> (Monomial.Interface[A, B, _] ~> Monomial.Interface[A, A => B, _]), Y] =
(s, a) => (p.`φ#`(s, a), p.φ(s)(a))

extension [S, A, A1, B1, A2, B2, Y] (p: PolyMap[Monomial.Store[S, _], Binomial.Interface[A1, A1 => B1, A2, A2 => B2, _], Y])
def asMealy(i: S)(
using R: Runner2[Monomial.Store[S, _] ~> Binomial.Interface[A1, A1 => B1, A2, A2 => B2, _], S, A1, B1, A2, B2]
): Mealy[Monomial.Store[S, _] ~> Binomial.Interface[A1, A1 => B1, A2, A2 => B2, _]] =
new Mealy[Monomial.Store[S, _] ~> Binomial.Interface[A1, A1 => B1, A2, A2 => B2, _]]:
def init[Y]: Init[(Monomial.Store[S, _]) ~> (Binomial.Interface[A1, A1 => B1, A2, A2 => B2, _]), Y] =
i
def readout[Y]: Readout[(Monomial.Store[S, _]) ~> (Binomial.Interface[A1, A1 => B1, A2, A2 => B2, _]), Y] =
p.φ
def update[Y]: Update[(Monomial.Store[S, _]) ~> (Binomial.Interface[A1, A1 => B1, A2, A2 => B2, _]), Y] =
p.`φ#`
def run[Y]: Run[(Monomial.Store[S, _]) ~> (Binomial.Interface[A1, A1 => B1, A2, A2 => B2, _]), Y] =
p.run

0 comments on commit 125404c

Please sign in to comment.