packages feed

kind-generics-deriving-0.3.0.0: src/Generics/Kind/Derive/Examples.hs

{-# OPTIONS_GHC -fno-warn-orphans  #-}
{-# language DataKinds             #-}
{-# language FlexibleInstances     #-}
{-# language MultiParamTypeClasses #-}
{-# language ScopedTypeVariables   #-}
{-# language TypeOperators         #-}
module Generics.Kind.Derive.Examples where

import           Data.Aeson                           (FromJSON (..), ToJSON (..))
import           Data.PolyKinded.Functor
import           Data.Traversable                     (foldMapDefault)

import           Generics.Kind
import           Generics.Kind.Derive.Eq
import           Generics.Kind.Derive.FunctorOne
import           Generics.Kind.Derive.FunctorPosition
import           Generics.Kind.Derive.Json
import           Generics.Kind.Derive.KFunctor
import           Generics.Kind.Derive.Traversable
import           Generics.Kind.Examples

-- Maybe
instance KFunctor Maybe '[ 'Co ] (a ':&&: 'LoT0) (b ':&&: 'LoT0) where
  kfmap = kfmapDefault

-- Tree
instance Eq a => Eq (Tree a) where
  (==) = geq'
instance ToJSON a => ToJSON (Tree a) where
  toJSON = gtoJSON'
instance FromJSON a => FromJSON (Tree a) where
  parseJSON = gfromJSON'
instance KFunctor Tree '[ 'Co ] (a ':&&: 'LoT0) (b ':&&: 'LoT0) where
  kfmap = kfmapDefault
instance Functor Tree where
  -- fmap = fmapDefault
  fmap = fmapDefaultOne
instance Foldable Tree where
  foldMap = foldMapDefault
instance Traversable Tree where
  traverse = traverseDefault

-- TTY (from https://gitlab.com/trupill/kind-generics/issues/3)
instance Eq (TTY m a) where
  (==) = geq'
instance ToJSON (TTY m a) where
  toJSON = gtoJSON'
{-
instance FromJSON (TTY m a) where
  parseJSON = gfromJSON'

Fails with:
• Couldn't match type ‘a’ with ‘()’ arising from a use of ‘gfromJSON'’
-}

fmapEither :: (a -> b) -> Either e a -> Either e b
fmapEither = fmapDefault'

-- WeirdTree
instance Show b => KFunctor WeirdTree '[ 'Co ] (a ':&&: 'LoT0) (b ':&&: 'LoT0) where
  kfmap = kfmapDefault

-- WeirdTree with reflected existentials
-- instance (Eq a) => Eq (WeirdTreeR a) where
  -- (==) = geq'

instance Functor (SimpleIndex a) where
  fmap = fmapDefault
instance Foldable (SimpleIndex a) where
  foldMap = foldMapDefault
instance Traversable (SimpleIndex a) where
  traverse = traverseDefault

instance EFunctor f => Functor (Hkd f) where
  fmap = fmapDefaultOne