{-# LANGUAGE TemplateHaskell #-}
{-# OPTIONS_GHC -Wno-orphans #-}
-- | This module defines 'GTraversable' instances for standard types
-- exported by "Prelude"
module Data.Generics.Traversable.Instances () where

import Data.Generics.Traversable.Core
import Data.Generics.Traversable.TH
import Data.Ratio

instance GTraversable c ()
instance GTraversable c Bool
instance GTraversable c Int
instance GTraversable c Integer
instance GTraversable c Float
instance GTraversable c Double
instance GTraversable c (Ratio n)
instance GTraversable c Char
instance GTraversable c Ordering

deriveGTraversable ''Maybe
deriveGTraversable ''Either
deriveGTraversable ''(,)
deriveGTraversable ''(,,)

-- Uniform instance for lists
instance c a => GTraversable c [a] where
  gtraverse :: (forall d. c d => d -> f d) -> [a] -> f [a]
gtraverse forall d. c d => d -> f d
f = [a] -> f [a]
forall a. c a => [a] -> f [a]
go where
    go :: [a] -> f [a]
go [] = [a] -> f [a]
forall (f :: * -> *) a. Applicative f => a -> f a
pure []
    go (a
x:[a]
xs) = (:) (a -> [a] -> [a]) -> f a -> f ([a] -> [a])
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> a -> f a
forall d. c d => d -> f d
f a
x f ([a] -> [a]) -> f [a] -> f [a]
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> [a] -> f [a]
go [a]
xs