packages feed

classify-frog-0.2.3: src/ClassRecord.hs

module ClassRecord where

import Control.DeepSeq (NFData, rnf)
import Control.Applicative (Applicative, pure, (<*>))

import qualified Data.Traversable as Trav
import qualified Data.Foldable as Fold
import Data.Traversable (Traversable, traverse)
import Data.Foldable (Foldable, foldMap)


{- |
Columns in the generated spreadsheet tables
are sorted according to the order of the record fields.
-}
data T a =
   Cons {
      advertisement, rasping, chirping, ticking, growling :: a
   }

names :: T String
names = Cons "Advertisement" "Rasping" "Chirping" "Ticking" "Growling"


instance NFData a => NFData (T a) where
   rnf = rnf . Fold.toList

instance Functor T where
   fmap = Trav.fmapDefault

instance Foldable T where
   foldMap = Trav.foldMapDefault

instance Traversable T where
   traverse f (Cons xAdvertisement xRasping xChirping xTicking xGrowling) =
      pure Cons <*> f xAdvertisement
         <*> f xRasping <*> f xChirping <*> f xTicking <*> f xGrowling

instance Applicative T where
   pure a = Cons a a a a a
   Cons fAdvertisement fRasping fChirping fTicking fGrowling <*>
         Cons xAdvertisement xRasping xChirping xTicking xGrowling =
      Cons
         (fAdvertisement xAdvertisement) (fRasping xRasping)
         (fChirping xChirping) (fTicking xTicking) (fGrowling xGrowling)