inj-base 0.1.0.0 → 0.2.0.0
raw patch · 2 files changed
+253/−41 lines, 2 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
- Inj.Base: instance (TypeError ...) => Inj.Inj p (Data.Either.Either x y)
- Inj.Base: instance (TypeError ...) => Inj.Inj p (x, y)
- Inj.Base: instance Inj.Inj p a => Inj.Inj p (Control.Applicative.ZipList a)
- Inj.Base: instance Inj.Inj p a => Inj.Inj p (Data.Functor.Identity.Identity a)
- Inj.Base: instance Inj.Inj p a => Inj.Inj p (Data.Semigroup.Option a)
- Inj.Base: instance Inj.Inj p a => Inj.Inj p (GHC.Base.Maybe a)
- Inj.Base: instance Inj.Inj p a => Inj.Inj p (GHC.Base.NonEmpty a)
- Inj.Base: instance Inj.Inj p a => Inj.Inj p (GHC.Conc.Sync.STM a)
- Inj.Base: instance Inj.Inj p a => Inj.Inj p (GHC.ST.ST s a)
- Inj.Base: instance Inj.Inj p a => Inj.Inj p (GHC.Types.IO a)
- Inj.Base: instance Inj.Inj p a => Inj.Inj p (r -> a)
- Inj.Base: instance Inj.Inj p a => Inj.Inj p [a]
+ Inj.Base: instance (Inj.Base.DecideFn p ~ Inj.Base.Decision_Map, p ~ (r -> p'), Inj.Inj p' a) => Inj.Base.InjFn Inj.Base.Decision_Map p r a
+ Inj.Base: instance (Inj.Base.DecideFn p ~ Inj.Base.Decision_Wrap, Inj.Inj p a) => Inj.Base.InjFn Inj.Base.Decision_Wrap p s a
+ Inj.Base: instance (Inj.Base.DecideIO p ~ Inj.Base.Decision_Map, p ~ GHC.Types.IO p', Inj.Inj p' a) => Inj.Base.InjIO Inj.Base.Decision_Map p a
+ Inj.Base: instance (Inj.Base.DecideIO p ~ Inj.Base.Decision_Wrap, Inj.Inj p a) => Inj.Base.InjIO Inj.Base.Decision_Wrap p a
+ Inj.Base: instance (Inj.Base.DecideIdentity p ~ Inj.Base.Decision_Map, p ~ Data.Functor.Identity.Identity p', Inj.Inj p' a) => Inj.Base.InjIdentity Inj.Base.Decision_Map p a
+ Inj.Base: instance (Inj.Base.DecideIdentity p ~ Inj.Base.Decision_Wrap, Inj.Inj p a) => Inj.Base.InjIdentity Inj.Base.Decision_Wrap p a
+ Inj.Base: instance (Inj.Base.DecideList p ~ Inj.Base.Decision_Map, p ~ [p'], Inj.Inj p' a) => Inj.Base.InjList Inj.Base.Decision_Map p a
+ Inj.Base: instance (Inj.Base.DecideList p ~ Inj.Base.Decision_Wrap, Inj.Inj p a) => Inj.Base.InjList Inj.Base.Decision_Wrap p a
+ Inj.Base: instance (Inj.Base.DecideMaybe p ~ Inj.Base.Decision_Map, p ~ GHC.Base.Maybe p', Inj.Inj p' a) => Inj.Base.InjMaybe Inj.Base.Decision_Map p a
+ Inj.Base: instance (Inj.Base.DecideMaybe p ~ Inj.Base.Decision_Wrap, Inj.Inj p a) => Inj.Base.InjMaybe Inj.Base.Decision_Wrap p a
+ Inj.Base: instance (Inj.Base.DecideNonEmpty p ~ Inj.Base.Decision_Map, p ~ GHC.Base.NonEmpty p', Inj.Inj p' a) => Inj.Base.InjNonEmpty Inj.Base.Decision_Map p a
+ Inj.Base: instance (Inj.Base.DecideNonEmpty p ~ Inj.Base.Decision_Wrap, Inj.Inj p a) => Inj.Base.InjNonEmpty Inj.Base.Decision_Wrap p a
+ Inj.Base: instance (Inj.Base.DecideOption p ~ Inj.Base.Decision_Map, p ~ Data.Semigroup.Option p', Inj.Inj p' a) => Inj.Base.InjOption Inj.Base.Decision_Map p a
+ Inj.Base: instance (Inj.Base.DecideOption p ~ Inj.Base.Decision_Wrap, Inj.Inj p a) => Inj.Base.InjOption Inj.Base.Decision_Wrap p a
+ Inj.Base: instance (Inj.Base.DecideST p ~ Inj.Base.Decision_Map, p ~ GHC.ST.ST s p', Inj.Inj p' a) => Inj.Base.InjST Inj.Base.Decision_Map p s a
+ Inj.Base: instance (Inj.Base.DecideST p ~ Inj.Base.Decision_Wrap, Inj.Inj p a) => Inj.Base.InjST Inj.Base.Decision_Wrap p s a
+ Inj.Base: instance (Inj.Base.DecideSTM p ~ Inj.Base.Decision_Map, p ~ GHC.Conc.Sync.STM p', Inj.Inj p' a) => Inj.Base.InjSTM Inj.Base.Decision_Map p a
+ Inj.Base: instance (Inj.Base.DecideSTM p ~ Inj.Base.Decision_Wrap, Inj.Inj p a) => Inj.Base.InjSTM Inj.Base.Decision_Wrap p a
+ Inj.Base: instance (Inj.Base.DecideZipList p ~ Inj.Base.Decision_Map, p ~ Control.Applicative.ZipList p', Inj.Inj p' a) => Inj.Base.InjZipList Inj.Base.Decision_Map p a
+ Inj.Base: instance (Inj.Base.DecideZipList p ~ Inj.Base.Decision_Wrap, Inj.Inj p a) => Inj.Base.InjZipList Inj.Base.Decision_Wrap p a
+ Inj.Base: instance (p ~ ()) => Inj.Inj p ()
+ Inj.Base: instance (p ~ Data.Proxy.Proxy t') => Inj.Inj p (Data.Proxy.Proxy t)
+ Inj.Base: instance (p ~ GHC.Types.Bool) => Inj.Inj p GHC.Types.Bool
+ Inj.Base: instance (p ~ GHC.Types.Ordering) => Inj.Inj p GHC.Types.Ordering
+ Inj.Base: instance (t ~ (pa, pb), Inj.Inj pa a, Inj.Inj pb b) => Inj.Inj t (a, b)
+ Inj.Base: instance (t ~ (pa, pb, pc), Inj.Inj pa a, Inj.Inj pb b, Inj.Inj pc c) => Inj.Inj t (a, b, c)
+ Inj.Base: instance (t ~ (pa, pb, pc, pd), Inj.Inj pa a, Inj.Inj pb b, Inj.Inj pc c, Inj.Inj pd d) => Inj.Inj t (a, b, c, d)
+ Inj.Base: instance (t ~ Data.Either.Either pa pb, Inj.Inj pa a, Inj.Inj pb b) => Inj.Inj t (Data.Either.Either a b)
+ Inj.Base: instance (t ~ Data.Functor.Const.Const pa pb, Inj.Inj pa a) => Inj.Inj t (Data.Functor.Const.Const a b)
+ Inj.Base: instance Inj.Base.InjFn (Inj.Base.DecideFn p) p r a => Inj.Inj p (r -> a)
+ Inj.Base: instance Inj.Base.InjIO (Inj.Base.DecideIO p) p a => Inj.Inj p (GHC.Types.IO a)
+ Inj.Base: instance Inj.Base.InjIdentity (Inj.Base.DecideIdentity p) p a => Inj.Inj p (Data.Functor.Identity.Identity a)
+ Inj.Base: instance Inj.Base.InjList (Inj.Base.DecideList p) p a => Inj.Inj p [a]
+ Inj.Base: instance Inj.Base.InjMaybe (Inj.Base.DecideMaybe p) p a => Inj.Inj p (GHC.Base.Maybe a)
+ Inj.Base: instance Inj.Base.InjNonEmpty (Inj.Base.DecideNonEmpty p) p a => Inj.Inj p (GHC.Base.NonEmpty a)
+ Inj.Base: instance Inj.Base.InjOption (Inj.Base.DecideOption p) p a => Inj.Inj p (Data.Semigroup.Option a)
+ Inj.Base: instance Inj.Base.InjST (Inj.Base.DecideST p) p s a => Inj.Inj p (GHC.ST.ST s a)
+ Inj.Base: instance Inj.Base.InjSTM (Inj.Base.DecideSTM p) p a => Inj.Inj p (GHC.Conc.Sync.STM a)
+ Inj.Base: instance Inj.Base.InjZipList (Inj.Base.DecideZipList p) p a => Inj.Inj p (Control.Applicative.ZipList a)
Files
- Inj/Base.hs +252/−40
- inj-base.cabal +1/−1
Inj/Base.hs view
@@ -2,7 +2,7 @@ {-# LANGUAGE DefaultSignatures,- MultiParamTypeClasses,+ FunctionalDependencies, FlexibleInstances, FlexibleContexts, TypeFamilies,@@ -14,10 +14,10 @@ module Inj.Base () where -import GHC.TypeLits import Control.Applicative import Control.Exception hiding (TypeError) import Control.Monad.ST+import Data.Bifunctor import Data.Complex import Data.Fixed import Data.Functor.Compose@@ -40,6 +40,125 @@ import Inj --------------------------------------------------------------------------------+-- Identity injections+--------------------------------------------------------------------------------++instance p ~ () => Inj p ()+instance p ~ Bool => Inj p Bool+instance p ~ Ordering => Inj p Ordering++instance p ~ Proxy t' => Inj p (Proxy t) where+ inj Proxy = Proxy++--------------------------------------------------------------------------------+-- Decision procedures for ambiguous injections+--------------------------------------------------------------------------------++data Decision_Wrap++data Decision_Map++type family DecideMaybe p where+ DecideMaybe (Maybe p) = Decision_Map+ DecideMaybe p = Decision_Wrap++class d ~ DecideMaybe p => InjMaybe d p a where+ injMaybe :: p -> Maybe a++instance InjMaybe (DecideMaybe p) p a => Inj p (Maybe a) where+ inj = injMaybe++type family DecideList p where+ DecideList [p] = Decision_Map+ DecideList p = Decision_Wrap++class d ~ DecideList p => InjList d p a where+ injList :: p -> [a]++instance InjList (DecideList p) p a => Inj p [a] where+ inj = injList++type family DecideNonEmpty p where+ DecideNonEmpty (NonEmpty p) = Decision_Map+ DecideNonEmpty p = Decision_Wrap++class d ~ DecideNonEmpty p => InjNonEmpty d p a where+ injNonEmpty :: p -> NonEmpty a++instance InjNonEmpty (DecideNonEmpty p) p a => Inj p (NonEmpty a) where+ inj = injNonEmpty++type family DecideIO p where+ DecideIO (IO p) = Decision_Map+ DecideIO p = Decision_Wrap++class d ~ DecideIO p => InjIO d p a where+ injIO :: p -> IO a++instance InjIO (DecideIO p) p a => Inj p (IO a) where+ inj = injIO++type family DecideSTM p where+ DecideSTM (STM p) = Decision_Map+ DecideSTM p = Decision_Wrap++class d ~ DecideSTM p => InjSTM d p a where+ injSTM :: p -> STM a++instance InjSTM (DecideSTM p) p a => Inj p (STM a) where+ inj = injSTM++type family DecideIdentity p where+ DecideIdentity (Identity p) = Decision_Map+ DecideIdentity p = Decision_Wrap++class d ~ DecideIdentity p => InjIdentity d p a where+ injIdentity :: p -> Identity a++instance InjIdentity (DecideIdentity p) p a => Inj p (Identity a) where+ inj = injIdentity++type family DecideZipList p where+ DecideZipList (ZipList p) = Decision_Map+ DecideZipList p = Decision_Wrap++class d ~ DecideZipList p => InjZipList d p a where+ injZipList :: p -> ZipList a++instance InjZipList (DecideZipList p) p a => Inj p (ZipList a) where+ inj = injZipList++type family DecideOption p where+ DecideOption (Option p) = Decision_Map+ DecideOption p = Decision_Wrap++class d ~ DecideOption p => InjOption d p a where+ injOption :: p -> Option a++instance InjOption (DecideOption p) p a => Inj p (Option a) where+ inj = injOption++type family DecideST p where+ DecideST (ST s p) = Decision_Map+ DecideST p = Decision_Wrap++class d ~ DecideST p => InjST d p s a where+ injST :: p -> ST s a++instance InjST (DecideST p) p s a => Inj p (ST s a) where+ inj = injST++type family DecideFn p where+ DecideFn (r -> p) = Decision_Map+ DecideFn p = Decision_Wrap++class d ~ DecideFn p => InjFn d p r a where+ injFn :: p -> r -> a++instance InjFn (DecideFn p) p r a => Inj p (r -> a) where+ inj = injFn++-------------------------------------------------------------------------------- -- 'fromIntegral' is an injection from any @Integral p@ to any @Num a@. -------------------------------------------------------------------------------- @@ -140,17 +259,29 @@ -- 'pure' is often an injection into @Applicative f@. -------------------------------------------------------------------------------- -instance Inj p a => Inj p [a] where- inj = pure . inj+instance+ (DecideList p ~ Decision_Wrap, Inj p a) =>+ InjList Decision_Wrap p a+ where+ injList = pure . inj -instance Inj p a => Inj p (Maybe a) where- inj = pure . inj+instance+ (DecideMaybe p ~ Decision_Wrap, Inj p a) =>+ InjMaybe Decision_Wrap p a+ where+ injMaybe = pure . inj -instance Inj p a => Inj p (IO a) where- inj = pure . inj+instance+ (DecideNonEmpty p ~ Decision_Wrap, Inj p a) =>+ InjNonEmpty Decision_Wrap p a+ where+ injNonEmpty = pure . inj -instance Inj p a => Inj p (NonEmpty a) where- inj = pure . inj+instance+ (DecideIO p ~ Decision_Wrap, Inj p a) =>+ InjIO Decision_Wrap p a+ where+ injIO = pure . inj instance Inj p a => Inj p (ReadP a) where inj = pure . inj@@ -176,17 +307,29 @@ instance Inj p a => Inj p (Data.Monoid.First a) where inj = pure . inj -instance Inj p a => Inj p (STM a) where- inj = pure . inj+instance+ (DecideSTM p ~ Decision_Wrap, Inj p a) =>+ InjSTM Decision_Wrap p a+ where+ injSTM = pure . inj -instance Inj p a => Inj p (Identity a) where- inj = pure . inj+instance+ (DecideIdentity p ~ Decision_Wrap, Inj p a) =>+ InjIdentity Decision_Wrap p a+ where+ injIdentity = pure . inj -instance Inj p a => Inj p (ZipList a) where- inj = pure . inj+instance+ (DecideZipList p ~ Decision_Wrap, Inj p a) =>+ InjZipList Decision_Wrap p a+ where+ injZipList = pure . inj -instance Inj p a => Inj p (Option a) where- inj = pure . inj+instance+ (DecideOption p ~ Decision_Wrap, Inj p a) =>+ InjOption Decision_Wrap p a+ where+ injOption = pure . inj instance Inj p a => Inj p (Data.Semigroup.Last a) where inj = pure . inj@@ -201,35 +344,104 @@ inj = pure . inj instance- TypeError- ('Text "Refusing to decide whether to inject " ':<>:- 'ShowType p ':<>: 'Text " into 'Left' " ':<>:- 'ShowType x ':<>: 'Text " or 'Right' " ':<>: 'ShowType y ':$$:- 'Text "in the " ':<>: 'ShowType Inj ':<>:- 'Text " instance for " ':<>: 'ShowType Either) =>- Inj p (Either x y)+ (DecideST p ~ Decision_Wrap, Inj p a) =>+ InjST Decision_Wrap p s a where- inj = error "impossible"+ injST = pure . inj instance- TypeError- ('Text "Refusing to decide whether to inject " ':<>:- 'ShowType p ':<>: 'Text " into 'fst' " ':<>:- 'ShowType x ':<>: 'Text " or 'snd' " ':<>: 'ShowType y ':$$:- 'Text "in the " ':<>: 'ShowType Inj ':<>:- 'Text " instance for " ':<>: 'ShowType (,)) =>- Inj p ((,) x y)+ (DecideFn p ~ Decision_Wrap, Inj p a) =>+ InjFn Decision_Wrap p s a where- inj = error "impossible"--instance Inj p a => Inj p (ST s a) where- inj = pure . inj--instance Inj p a => Inj p (r -> a) where- inj = pure . inj+ injFn = pure . inj instance Inj p (f (g a)) => Inj p (Compose f g a) where inj = Compose . inj++--------------------------------------------------------------------------------+-- 'fmap', 'bimap', etc, can be used to map injections+--------------------------------------------------------------------------------++instance+ (DecideMaybe p ~ Decision_Map, p ~ Maybe p', Inj p' a) =>+ InjMaybe Decision_Map p a+ where+ injMaybe = fmap inj++instance+ (DecideList p ~ Decision_Map, p ~ [p'], Inj p' a) =>+ InjList Decision_Map p a+ where+ injList = fmap inj++instance+ (DecideNonEmpty p ~ Decision_Map, p ~ NonEmpty p', Inj p' a) =>+ InjNonEmpty Decision_Map p a+ where+ injNonEmpty = fmap inj++instance+ (DecideIO p ~ Decision_Map, p ~ IO p', Inj p' a) =>+ InjIO Decision_Map p a+ where+ injIO = fmap inj++instance+ (DecideSTM p ~ Decision_Map, p ~ STM p', Inj p' a) =>+ InjSTM Decision_Map p a+ where+ injSTM = fmap inj++instance+ (DecideIdentity p ~ Decision_Map, p ~ Identity p', Inj p' a) =>+ InjIdentity Decision_Map p a+ where+ injIdentity = fmap inj++instance+ (DecideZipList p ~ Decision_Map, p ~ ZipList p', Inj p' a) =>+ InjZipList Decision_Map p a+ where+ injZipList = fmap inj++instance+ (DecideOption p ~ Decision_Map, p ~ Option p', Inj p' a) =>+ InjOption Decision_Map p a+ where+ injOption = fmap inj++instance+ (DecideST p ~ Decision_Map, p ~ ST s p', Inj p' a) =>+ InjST Decision_Map p s a+ where+ injST = fmap inj++instance+ (DecideFn p ~ Decision_Map, p ~ (r -> p'), Inj p' a) =>+ InjFn Decision_Map p r a+ where+ injFn = fmap inj++instance (t ~ (pa, pb), Inj pa a, Inj pb b) => Inj t (a, b) where+ inj = bimap inj inj++instance+ (t ~ (pa, pb, pc), Inj pa a, Inj pb b, Inj pc c) =>+ Inj t (a, b, c)+ where+ inj (pa, pb, pc) = (inj pa, inj pb, inj pc)++instance+ (t ~ (pa, pb, pc, pd), Inj pa a, Inj pb b, Inj pc c, Inj pd d) =>+ Inj t (a, b, c, d)+ where+ inj (pa, pb, pc, pd) = (inj pa, inj pb, inj pc, inj pd)++instance (t ~ Either pa pb, Inj pa a, Inj pb b) => Inj t (Either a b) where+ inj = bimap inj inj++instance (t ~ Const pa pb, Inj pa a) => Inj t (Const a b) where+ inj (Const pa) = Const (inj pa) -------------------------------------------------------------------------------- -- Generic
inj-base.cabal view
@@ -1,5 +1,5 @@ name: inj-base-version: 0.1.0.0+version: 0.2.0.0 synopsis: 'Inj' instances for 'base' license: BSD3 license-file: LICENSE