packages feed

crem-0.1.0.0: examples/Crem/Example/TriangularMachine.hs

{-# LANGUAGE DataKinds #-}
{-# LANGUAGE GADTs #-}

module Crem.Example.TriangularMachine where

import Crem.BaseMachine (InitialState (..), pureResult)
import Crem.StateMachine (StateMachine, unrestrictedMachine)

data TriangularState (a :: ()) where
  OnlyState :: Int -> TriangularState '()

triangular :: StateMachine Int Int
triangular =
  unrestrictedMachine
    ( \case
        OnlyState state ->
          \input ->
            pureResult
              (state + input)
              (OnlyState $ state + 1)
    )
    (InitialState (OnlyState 0))