{-# LANGUAGE TypeFamilies, FlexibleContexts, FlexibleInstances,
DefaultSignatures, DeriveGeneric, TypeOperators #-}
module ALife.Creatur.Genetics.Analysis
(
Analysable(..)
) where
import Data.Word (Word8, Word16)
import GHC.Generics
class Analysable g where
analyse :: g -> String
default analyse :: (Generic g, GAnalysable (Rep g)) => g -> String
analyse = Rep g Any -> String
forall (f :: * -> *) a. GAnalysable f => f a -> String
ganalyse (Rep g Any -> String) -> (g -> Rep g Any) -> g -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. g -> Rep g Any
forall a x. Generic a => a -> Rep a x
from
class GAnalysable f where
ganalyse :: f a -> String
instance GAnalysable U1 where
ganalyse :: U1 a -> String
ganalyse U1 a
U1 = String
"U1 "
instance (GAnalysable a, GAnalysable b) => GAnalysable (a :*: b) where
ganalyse :: (:*:) a b a -> String
ganalyse (a a
a :*: b a
b) = a a -> String
forall (f :: * -> *) a. GAnalysable f => f a -> String
ganalyse a a
a String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
":*: " String -> String -> String
forall a. [a] -> [a] -> [a]
++ b a -> String
forall (f :: * -> *) a. GAnalysable f => f a -> String
ganalyse b a
b
instance (GAnalysable a, GAnalysable b) => GAnalysable (a :+: b) where
ganalyse :: (:+:) a b a -> String
ganalyse (L1 a a
x) = String
"L1 " String -> String -> String
forall a. [a] -> [a] -> [a]
++ a a -> String
forall (f :: * -> *) a. GAnalysable f => f a -> String
ganalyse a a
x
ganalyse (R1 b a
x) = String
"R1 " String -> String -> String
forall a. [a] -> [a] -> [a]
++ b a -> String
forall (f :: * -> *) a. GAnalysable f => f a -> String
ganalyse b a
x
instance (GAnalysable a) => GAnalysable (M1 i c a) where
ganalyse :: M1 i c a a -> String
ganalyse (M1 a a
x) = String
"M1 " String -> String -> String
forall a. [a] -> [a] -> [a]
++ a a -> String
forall (f :: * -> *) a. GAnalysable f => f a -> String
ganalyse a a
x
instance (Analysable a) => GAnalysable (K1 i a) where
ganalyse :: K1 i a a -> String
ganalyse (K1 a
x) = String
"K1 " String -> String -> String
forall a. [a] -> [a] -> [a]
++ a -> String
forall g. Analysable g => g -> String
analyse a
x
instance Analysable Bool where
analyse :: Bool -> String
analyse Bool
x = Bool -> String
forall a. Show a => a -> String
show Bool
x String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" "
instance Analysable Char where
analyse :: Char -> String
analyse Char
x = Char -> String
forall a. Show a => a -> String
show Char
x String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" "
instance Analysable Word8 where
analyse :: Word8 -> String
analyse Word8
x = Word8 -> String
forall a. Show a => a -> String
show Word8
x String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" "
instance Analysable Word16 where
analyse :: Word16 -> String
analyse Word16
x = Word16 -> String
forall a. Show a => a -> String
show Word16
x String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" "
instance (Analysable a) => Analysable [a]
instance (Analysable a) => Analysable (Maybe a)
instance (Analysable a, Analysable b) => Analysable (a, b)
instance (Analysable a, Analysable b) => Analysable (Either a b)