-- | -- Module : Control.Antikythera.Unit.Unit -- Copyright : Gautier DI FOLCO -- License : ISC -- -- Maintainer : Gautier DI FOLCO <gautier.difolco@gmail.com> -- Stability : Stable -- Portability : Portable -- -- Standalone definition 'Unit', for 'Periodicy' definition module Control.Antikythera.Unit.Unit (Unit (..)) where -- | Type use to define 'Periodicy' patterns (e.g. 'every', 'at') for time types -- -- For example: -- -- > instance HasMinute TimeOfDay where -- > minute = -- > Unit -- > { extract = todMin -- > , nextUnitWith = \n x -> -- > let m = n `mod` 60 -- > in Just $ TimeOfDay ((x.todHour + (if m <= x.todMin then 1 else 0)) `mod` 24) m 0 -- > } data Unit i a = Unit { forall i a. Unit i a -> a -> i extract :: a -> i, -- | should apply modulo forall i a. Unit i a -> i -> a -> Maybe a nextUnitWith :: i -> a -> Maybe a }