{- | Identifier generator

A simple test of whether identifiers can be re-used in SuperCollider.
This has no practical use.

-}

module Haskore.General.IdGenerator.Modulo where

import Control.Monad.Trans.State (State, evalState, modify, get, )

{- |

The generator is a simple state monad.

-}

type T i a = State i a

run :: i -> T i a -> a
run = flip evalState

{- |

Reserve a new id.

-}

alloc :: (Integral i) => T i i
alloc =
   do newId <- get
      modify (flip mod 50 . succ)
      return (newId+2)

{- |

Unreserve an id.
In this implementation it performs essentially nothing.

-}

free :: i -> T i ()
free _ = return ()