{-# LANGUAGE UndecidableInstances #-} {-# LANGUAGE TypeFamilies #-} {-# LANGUAGE PolyKinds #-} module Data.Container.Parametrized where --import Prologue --import Data.Container.Class --import Data.Container.Poly --import Data.Container.Weak --import Data.Layer --newtype Parametrized t (m :: * -> *) a = Parametrized { _parametrized :: t (m a) } deriving (Show, Functor, Traversable, Foldable, FromList, Monoid, Default) --type instance Item (Parametrized t m a) = Item (Unwrapped (Parametrized t m a)) --type instance ModsOf (cls :: k) (Parametrized t m a) = ModsOf cls (Unwrapped (Parametrized t m a)) --type instance DataStoreOf (Parametrized t m a) = DataStoreOf (Unwrapped (Parametrized t m a)) --type instance ContainerOf (Parametrized t m a) = ContainerOf (Unwrapped (Parametrized t m a)) ---- Wrappers & layers --type instance Unlayered (Parametrized t m a) = Unwrapped (Parametrized t m a) --instance Layered (Parametrized t m a) --instance Wrapped (Parametrized t m a) where -- type Unwrapped (Parametrized t m a) = t (m a) -- _Wrapped' = iso (\(Parametrized c) -> c) Parametrized ---- Instances --instance IsContainer (t (m a)) => IsContainer (Parametrized t m a) where fromContainer = Parametrized . fromContainer --instance HasContainer (t (m a)) => HasContainer (Parametrized t m a) where container = layered . container --type instance ElementOf (Parametrized t m a) = ElementOf (t (m a)) --type instance IndexOf el (Parametrized t m a) = IndexOf el (t (m a)) --type instance HomoIndexOf (Parametrized t m) = HomoIndexOf m ---- Lenses --makeLenses ''Parametrized