module Data.Apart.Transformations (Attached (..), Embedded (..), Injected (..), Segmented (..), Scattered (..)) where

import "base" Data.Functor.Compose (Compose)
import "base" Data.Kind (Type)
import "free" Control.Comonad.Cofree (Cofree)

import Data.Apart (Apart)

type (:.:) = Compose

type family Attached (structure :: Type -> Type) (extension :: Type -> Type) (value :: Type) :: Type where
        Attached (Cofree t) extension value = Cofree t (extension value)

type family Embedded (structure :: Type -> Type) (extension :: Type -> Type) (value :: Type) :: Type where
        Embedded (Cofree t) extension value = Cofree (extension :.: t) value

type family Injected (structure :: Type -> Type) (extension :: Type -> Type) (value :: Type) :: Type where
        Injected (Cofree t) extension value = Cofree (t :.: extension) value

type family Segmented (structure :: Type -> Type) (value :: Type) :: Type where
        Segmented (Cofree t) value = t (Cofree t value)

type family Scattered (structure :: Type -> Type) (value :: Type) (raw :: Type) :: Type where
        Scattered (Cofree t) value raw = Apart t raw value