{-# LANGUAGE GADTs #-}
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}
module Data.IFunctor where
import Data.Data
import Data.Kind
infixr 0 ~>
type f ~> g = forall x. f x -> g x
class IFunctor f where
imap :: (a ~> b) -> f a ~> f b
class (IFunctor m) => IMonad m where
ireturn :: a ~> m a
ibind :: (a ~> m b) -> m a ~> m b
class (IMonad m) => IMonadFail m where
fail :: String -> m a ix
data At :: Type -> k -> k -> Type where
At :: a -> At a k k
deriving (Typeable)
(>>=) :: (IMonad (m :: (x -> Type) -> x -> Type)) => m a ix -> (a ~> m b) -> m b ix
m a ix
m >>= :: forall x (m :: (x -> *) -> x -> *) (a :: x -> *) (ix :: x)
(b :: x -> *).
IMonad m =>
m a ix -> (a ~> m b) -> m b ix
>>= a ~> m b
f = (a ~> m b) -> m a ~> m b
forall {k} (m :: (k -> *) -> k -> *) (a :: k -> *) (b :: k -> *).
IMonad m =>
(a ~> m b) -> m a ~> m b
forall (a :: x -> *) (b :: x -> *). (a ~> m b) -> m a ~> m b
ibind a x -> m b x
a ~> m b
f m a ix
m
(>>) :: (IMonad (m :: (x -> Type) -> x -> Type)) => m (At a j) i -> m b j -> m b i
m (At a j) i
m >> :: forall x (m :: (x -> *) -> x -> *) a (j :: x) (i :: x)
(b :: x -> *).
IMonad m =>
m (At a j) i -> m b j -> m b i
>> m b j
f = (At a j ~> m b) -> m (At a j) ~> m b
forall {k} (m :: (k -> *) -> k -> *) (a :: k -> *) (b :: k -> *).
IMonad m =>
(a ~> m b) -> m a ~> m b
forall (a :: x -> *) (b :: x -> *). (a ~> m b) -> m a ~> m b
ibind (\(At a
_) -> m b j
m b x
f) m (At a j) i
m
returnAt :: (IMonad m) => a -> m (At a k) k
returnAt :: forall {k} (m :: (k -> *) -> k -> *) a (k :: k).
IMonad m =>
a -> m (At a k) k
returnAt = At a k k -> m (At a k) k
forall {k} (m :: (k -> *) -> k -> *) (a :: k -> *).
IMonad m =>
a ~> m a
forall (a :: k -> *). a ~> m a
ireturn (At a k k -> m (At a k) k) -> (a -> At a k k) -> a -> m (At a k) k
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> At a k k
forall {k} a (k :: k). a -> At a k k
At