1
Fork 0
solar-conflux/purescript/factorio-throughput/src/Run/Id.purs
2021-04-04 00:37:14 +03:00

33 lines
1 KiB
Plaintext

module Run.Supply where
import Prelude
import Data.Tuple (Tuple(..))
import Run (Run, Step(..), lift, on, runAccumPure)
import Type.Proxy (Proxy(..))
-- | Monad providing an infinite supply of values of a particular type.
-- | Example use cases: generating unique ids.
data SupplyF s a = Supply (s -> a)
type SUPPLY s r = ( supply :: SupplyF s | r )
generate :: forall r s. Run (SUPPLY s r) s
generate = lift _supply (Supply identity)
-- | Elimininate the supply monad using a function generating the next value
runSupply :: forall r s a. (s -> s) -> s -> Run (SUPPLY s r) a -> Run r a
runSupply next
= runAccumPure
(next >>> \current -> on _supply (Loop <<< handleSupply current) Done)
(\s a -> a)
where
handleSupply :: forall i. s -> SupplyF s i -> Tuple s i
handleSupply current (Supply continue) = Tuple current (continue current)
---------- Typeclass instances
derive instance functorSupply :: Functor (SupplyF s)
--------- SProxies
_supply :: Proxy "supply"
_supply = Proxy