{-# LANGUAGE DefaultSignatures #-} {-# LANGUAGE TypeOperators #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE FunctionalDependencies #-} module Language.Fortran.Util.FirstParameter(FirstParameter(..), GFirstParameter(..)) where import GHC.Generics class FirstParameter a e | a -> e where getFirstParameter :: a -> e setFirstParameter :: e -> a -> a default getFirstParameter :: (Generic a, GFirstParameter (Rep a) e) => a -> e getFirstParameter = Rep a Any -> e forall (f :: * -> *) e a. GFirstParameter f e => f a -> e getFirstParameter' (Rep a Any -> e) -> (a -> Rep a Any) -> a -> e forall b c a. (b -> c) -> (a -> b) -> a -> c . a -> Rep a Any forall a x. Generic a => a -> Rep a x from default setFirstParameter :: (Generic a, GFirstParameter (Rep a) e) => e -> a -> a setFirstParameter e e = Rep a Any -> a forall a x. Generic a => Rep a x -> a to (Rep a Any -> a) -> (a -> Rep a Any) -> a -> a forall b c a. (b -> c) -> (a -> b) -> a -> c . e -> Rep a Any -> Rep a Any forall (f :: * -> *) e a. GFirstParameter f e => e -> f a -> f a setFirstParameter' e e (Rep a Any -> Rep a Any) -> (a -> Rep a Any) -> a -> Rep a Any forall b c a. (b -> c) -> (a -> b) -> a -> c . a -> Rep a Any forall a x. Generic a => a -> Rep a x from class GFirstParameter f e where getFirstParameter' :: f a -> e setFirstParameter' :: e -> f a -> f a instance {-# OVERLAPPING #-} GFirstParameter (K1 i e) e where getFirstParameter' :: K1 i e a -> e getFirstParameter' (K1 e a) = e a setFirstParameter' :: e -> K1 i e a -> K1 i e a setFirstParameter' e e (K1 e _) = e -> K1 i e a forall k i c (p :: k). c -> K1 i c p K1 e e instance {-# OVERLAPPABLE #-} GFirstParameter (K1 i a) e where getFirstParameter' :: K1 i a a -> e getFirstParameter' K1 i a a _ = e forall a. HasCallStack => a undefined setFirstParameter' :: e -> K1 i a a -> K1 i a a setFirstParameter' e _ K1 i a a _ = K1 i a a forall a. HasCallStack => a undefined instance GFirstParameter a e => GFirstParameter (M1 i c a) e where getFirstParameter' :: M1 i c a a -> e getFirstParameter' (M1 a a a) = a a -> e forall (f :: * -> *) e a. GFirstParameter f e => f a -> e getFirstParameter' a a a setFirstParameter' :: e -> M1 i c a a -> M1 i c a a setFirstParameter' e e (M1 a a a) = a a -> M1 i c a a forall k i (c :: Meta) (f :: k -> *) (p :: k). f p -> M1 i c f p M1 (a a -> M1 i c a a) -> a a -> M1 i c a a forall a b. (a -> b) -> a -> b $ e -> a a -> a a forall (f :: * -> *) e a. GFirstParameter f e => e -> f a -> f a setFirstParameter' e e a a a instance (GFirstParameter a e, GFirstParameter b e) => GFirstParameter (a :+: b) e where getFirstParameter' :: (:+:) a b a -> e getFirstParameter' (L1 a a a) = a a -> e forall (f :: * -> *) e a. GFirstParameter f e => f a -> e getFirstParameter' a a a getFirstParameter' (R1 b a a) = b a -> e forall (f :: * -> *) e a. GFirstParameter f e => f a -> e getFirstParameter' b a a setFirstParameter' :: e -> (:+:) a b a -> (:+:) a b a setFirstParameter' e e (L1 a a a) = a a -> (:+:) a b a forall k (f :: k -> *) (g :: k -> *) (p :: k). f p -> (:+:) f g p L1 (a a -> (:+:) a b a) -> a a -> (:+:) a b a forall a b. (a -> b) -> a -> b $ e -> a a -> a a forall (f :: * -> *) e a. GFirstParameter f e => e -> f a -> f a setFirstParameter' e e a a a setFirstParameter' e e (R1 b a a) = b a -> (:+:) a b a forall k (f :: k -> *) (g :: k -> *) (p :: k). g p -> (:+:) f g p R1 (b a -> (:+:) a b a) -> b a -> (:+:) a b a forall a b. (a -> b) -> a -> b $ e -> b a -> b a forall (f :: * -> *) e a. GFirstParameter f e => e -> f a -> f a setFirstParameter' e e b a a instance (GFirstParameter a e, GFirstParameter b e) => GFirstParameter (a :*: b) e where getFirstParameter' :: (:*:) a b a -> e getFirstParameter' (a a a :*: b a _) = a a -> e forall (f :: * -> *) e a. GFirstParameter f e => f a -> e getFirstParameter' a a a setFirstParameter' :: e -> (:*:) a b a -> (:*:) a b a setFirstParameter' e e (a a a :*: b a b) = e -> a a -> a a forall (f :: * -> *) e a. GFirstParameter f e => e -> f a -> f a setFirstParameter' e e a a a a a -> b a -> (:*:) a b a forall k (f :: k -> *) (g :: k -> *) (p :: k). f p -> g p -> (:*:) f g p :*: b a b instance (GFirstParameter U1 String) where getFirstParameter' :: U1 a -> String getFirstParameter' U1 a _ = String "" setFirstParameter' :: String -> U1 a -> U1 a setFirstParameter' String _ U1 a e = U1 a e