{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE UndecidableInstances #-}
{-# OPTIONS_HADDOCK not-home #-}
module Effectful.Internal.Has
( Effect
, (:>)
, ixEnv
) where
import Data.Kind
type Effect = Type
class (e :: Effect) :> (es :: [Effect]) where
ixOf :: Int
ixOf =
[Char] -> Int
forall a. HasCallStack => [Char] -> a
error [Char]
"unimplemented"
instance {-# OVERLAPPING #-} e :> (e : es) where
ixOf :: Int
ixOf = Int
0
instance e :> es => e :> (x : es) where
ixOf :: Int
ixOf = Int
1 Int -> Int -> Int
forall (a :: Effect). Num a => a -> a -> a
+ (e :> es) => Int
forall (e :: Effect) (es :: [Effect]). (e :> es) => Int
ixOf @e @es
ixEnv :: forall e es. e :> es => Int -> Int
ixEnv :: Int -> Int
ixEnv Int
n = Int
n Int -> Int -> Int
forall (a :: Effect). Num a => a -> a -> a
- (e :> es) => Int
forall (e :: Effect) (es :: [Effect]). (e :> es) => Int
ixOf @e @es Int -> Int -> Int
forall (a :: Effect). Num a => a -> a -> a
- Int
1