HORIZON HASKELLDocslts/ghc-10.0.x8fef28d2026-11-02Search packagesCtrl K
Theme: |

GHC 10.0.0.20260917 · lts/ghc-10.0.x · 8fef28d · 2026-11-02

Moduletidal-core-1.10.2Haskell2010

Sound.Tidal.Time

Contents
  1. Utility functions - Time
  2. Utility functions - Arc
Synopsis
datadata ArcF a

An arc of time, with a start time (or onset) and a stop time (or offset)

Constructors

Instances12Functor, Applicative, Eq, Fractional, Num, Ord, …

Utility functions - Time

valuesam :: Time -> Time

The sam (start of cycle) for the given time value. Cycles have duration 1, so every integer Time value divides two cycles.

valuenextSam :: Time -> Time

The end point of the current cycle (and starting point of the next cycle)

Utility functions - Arc

valuesubArc :: Arc -> Arc -> Maybe Arc

subArc i j is the timespan that is the intersection of i and j. intersection The definition is a bit fiddly as results might be zero-width, but not at the end of an non-zero-width arc - e.g. (0,1) and (1,2) do not intersect, but (1,1) (1,1) does.

The Arc returned is the cycle that the Time falls within.

Edge case: If the Time is an integer, the Arc claiming it is the one starting at that Time, not the previous one ending at that Time.

valuecycleArc :: Arc -> Arc

Shifts an Arc to one of equal duration that starts within cycle zero. (Note that the output Arc probably does not start *at* Time 0 -- that only happens when the input Arc starts at an integral Time.)

valuecyclesInArc :: Integral a => Arc -> [a]

Returns the numbers of the cycles that the input Arc overlaps (excluding the input Arc's endpoint, unless it has duration 0 -- see "Edge cases" below). (The "cycle number" of an Arc is equal to its start value. Thus, for instance, cyclesInArc (Arc 0 1.5) == [0,1].)

Edge cases: > cyclesInArc $ Arc 0 1.0001 == [0,1] > cyclesInArc $ Arc 0 1 == [0] -- the endpoint is excluded > cyclesInArc $ Arc 1 1 == [1] -- unless the Arc has duration 0

PITFALL: Don't be fooled by the name. The output cycles are not necessarily completely contained in the input Arc, but they definitely overlap it, and they include every cycle that overlaps it.

valuecycleArcsInArc :: Arc -> [Arc]

This provides exactly the same information as cyclesInArc, except that this represents its output as Arcs, whereas cyclesInArc represents the same information as integral indices. (The Arc from 0 to 1 corresponds to the index 0, the one from 1 to 2 has index 1, etc.)

valuemapCycle :: (Time -> Time) -> Arc -> Arc

Similar to fmap but time is relative to the cycle (i.e. the sam of the start of the arc)