module Time where
type Time = Rational
type Arc = (Time, Time)
type Event a = (Arc, a)
sam :: Time -> Time
sam = fromIntegral . floor
nextSam :: Time -> Time
nextSam = (1+) . sam
cyclePos :: Time -> Time
cyclePos t = t sam t
isIn :: Arc -> Time -> Bool
isIn (s,e) t = t >= s && t < e
arcCycles :: Arc -> [Arc]
arcCycles (s,e) | s >= e = []
| sam s == sam e = [(s,e)]
| otherwise = (s, nextSam s) : (arcCycles (nextSam s, e))
subArc :: Arc -> Arc -> Maybe Arc
subArc (s, e) (s',e') | s'' < e'' = Just (s'', e'')
| otherwise = Nothing
where s'' = max s s'
e'' = min e e'
mapArc :: (Time -> Time) -> Arc -> Arc
mapArc f (s,e) = (f s, f e)
mirrorArc :: Arc -> Arc
mirrorArc (s, e) = (sam s + (nextSam s e), nextSam s (s sam s))
eventStart :: Event a -> Time
eventStart = fst . fst