packages feed

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 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