module Arduino.Library.Time
( accumulator
, accumulatorConstLimit
) where
import Arduino.DSL
import Arduino.Library.Tuples
import Prelude hiding (Word)
accumulator :: Stream Word -> Stream Word -> Stream ()
accumulator limitStream deltaStream = unitStream
where
unitStream = mapS (const unit) wrappedStream
wrappedStream = filterS2Tuple isWrap didWrapTotalStream
didWrapTotalStream = foldpS accumulate (pack2 (0, 0)) limitDeltaStream
limitDeltaStream = pack2Stream limitStream deltaStream
accumulate :: Expression (Word, Word)
-> Expression (Word, Word)
-> Expression (Word, Word)
accumulate limitDelta didWrapTotal =
let (limit, delta) = unpack2 limitDelta
(didWrap, total) = unpack2 didWrapTotal
in if_ (greater (total+delta) limit)
(pack2 (0, 0))
(pack2 (1, total+delta))
isWrap :: (Expression Word, Expression Word) -> Expression Bool
isWrap (didWrap, _) = isEqual didWrap 0
accumulatorConstLimit :: Expression Word -> Stream Word -> Stream ()
accumulatorConstLimit limit = accumulator (constStream limit)