container-1.0.2: src/Data/Container/Auto.hs
{-# LANGUAGE CPP #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE UndecidableInstances #-}
module Data.Container.Auto where
import Prelude
import Control.Lens
import Control.Lens.Utils
import Data.Container.Class
import Data.Container.Resizable
import Data.Container.Reusable
import Data.Container.List
import Data.Layer
import Data.Default
#define AUTO (Reusable idx (Resizable style a))
newtype IxedAuto idx style a = IxedAuto AUTO deriving (Functor, Traversable, Foldable, Monoid, Default)
type Auto style a = IxedAuto (Index (Container a)) style a
deriving instance (IsContainer a, FromList (Container a), Default style) => FromList (IxedAuto idx style a)
type instance Index (IxedAuto idx style a) = Index AUTO
type instance Item (IxedAuto idx style a) = Item AUTO
type instance DataStore (IxedAuto idx style a) = DataStore AUTO
type instance Container (IxedAuto idx style a) = Container AUTO
instance Monad m => IsContainerM m (IxedAuto idx style a) where fromContainerM = fmap IxedAuto . fromContainerM
instance Monad m => HasContainerM m (IxedAuto idx style a) where viewContainerM = viewContainerM . view layered
setContainerM = layered . setContainerM
instance (HasContainer a, ToList (Container a)) => ToList (IxedAuto idx s a) where toList = toList . unwrap'
-- Wrappers & layers
type instance Unlayered (IxedAuto idx style a) = AUTO
instance Layered (IxedAuto idx style a)
instance Monad m => LayeredM m (IxedAuto idx style a)
instance Wrapped (IxedAuto idx style a) where
type Unwrapped (IxedAuto idx style a) = AUTO
_Wrapped' = iso (\(IxedAuto a) -> a) IxedAuto
deriving instance Show AUTO => Show (IxedAuto idx style a)
--instance Show a => Show (Auto idx style a) where
-- showsPrec d (Auto a) = showParen (d > app_prec) $
-- showString "Auto " . showsPrec (succ app_prec) (view (layered . layered) a)
-- --showString $ "Auto " <> show (elems a :: [Item a]) -- . showsPrec (succ app_prec) (view (layered . layered) a)
-- where app_prec = 10