{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE UndecidableInstances #-}

module Control.ConstraintKinds.Pointed
    where

import GHC.Prim

import qualified Data.Foldable as F
import qualified Data.List as L
import qualified Data.Traversable as T
import qualified Data.Vector as V
import qualified Data.Vector.Unboxed as VU
import qualified Data.Vector.Generic as G
import qualified Prelude as P

import Control.ConstraintKinds.Functor

-------------------------------------------------------------------------------
-- class Functor

class (Functor f) => Pointed f where
    type PointedConstraint f x :: Constraint
    type PointedConstraint f x = FunctorConstraint f x
    
    point :: (PointedConstraint f a) => a -> f a

-------------------------------------------------------------------------------
-- Instances

instance Pointed [] where
    {-# INLINE point #-}
    point x = [x]

instance Pointed V.Vector where
    {-# INLINE point #-}
    point = V.singleton

instance Pointed VU.Vector where
    type PointedConstraint VU.Vector x = VU.Unbox x
    {-# INLINE point #-}
    point = VU.singleton