expressions 0.4 → 0.4.1
raw patch · 4 files changed
+21/−14 lines, 4 files
Files
- ChangeLog.md +1/−1
- expressions.cabal +1/−1
- src/Data/Expression.hs +2/−0
- src/Data/Expression/Array.hs +17/−12
ChangeLog.md view
@@ -1,6 +1,6 @@ # Change Log -## 0.4+## 0.4.1 * Allow a wide range of dynamically sorted values (not just expressions) * Utility for extracting array accesses
expressions.cabal view
@@ -1,5 +1,5 @@ name: expressions-version: 0.4+version: 0.4.1 synopsis: Expressions and Formulae a la carte description: This package is aimed at providing means of fixing a first-order language and
src/Data/Expression.hs view
@@ -40,6 +40,7 @@ , module Data.Expression.Utils.Indexed.Show , module Data.Expression.Utils.Indexed.Sum , module Data.Expression.Utils.Indexed.Traversable+ , module Data.Expression.Utils.Indexed.Tuple -- Functors representing usual combinations of languages , QFLogicF@@ -154,6 +155,7 @@ import Data.Expression.Utils.Indexed.Show import Data.Expression.Utils.Indexed.Sum import Data.Expression.Utils.Indexed.Traversable+import Data.Expression.Utils.Indexed.Tuple import qualified Data.Functor.Const as F import qualified Prelude as P
src/Data/Expression/Array.hs view
@@ -20,7 +20,11 @@ module Data.Expression.Array ( ArrayF(..) , select , store- , accesses ) where+ , accesses+ , StaticallyValuedArrayAccess(..)+ , DynamicallyValuedArrayAccess(..)+ , StaticallyIndexedArrayAccess(..)+ , DynamicallyIndexedArrayAccess(..) ) where import Control.Monad.Trans.Writer import Data.Coerce@@ -111,24 +115,25 @@ store :: ( ArrayF :<: f, SingI i, SingI e ) => IFix f ('ArraySort i e) -> IFix f i -> IFix f e -> IFix f ('ArraySort i e) store a i v = inject (Store sing sing a i v) -newtype Array1 f (i :: Sort) (e :: Sort) = Array1 (IFix f ('ArraySort i e))-newtype Array2 f (i :: Sort) = Array2 (DynamicallySorted (Array1 f i))+newtype StaticallyValuedArrayAccess f (s :: Sort) (e :: Sort) = StaticallyValuedArrayAccess (IFix f ('ArraySort s e))+newtype DynamicallyValuedArrayAccess f (s :: Sort) = DynamicallyValuedArrayAccess (DynamicallySorted (StaticallyValuedArrayAccess f s)) -type ArrayAccess f = DynamicallySorted (IT2 (Array2 f) (IFix f))+newtype StaticallyIndexedArrayAccess f (s :: Sort) = StaticallyIndexedArrayAccess (IT2 (DynamicallyValuedArrayAccess f) (IFix f) s)+newtype DynamicallyIndexedArrayAccess f = DynamicallyIndexedArrayAccess (DynamicallySorted (StaticallyIndexedArrayAccess f)) -instance ( IFunctor f, IShow f ) => Show (Array1 f i e) where- show (Array1 f) = show f+instance ( IFunctor f, IShow f ) => Show (StaticallyValuedArrayAccess f i e) where+ show (StaticallyValuedArrayAccess f) = show f -instance ( IFunctor f, IShow f ) => Show (Array2 f i) where- show (Array2 f) = show f+instance ( IFunctor f, IShow f ) => Show (DynamicallyValuedArrayAccess f i) where+ show (DynamicallyValuedArrayAccess f) = show f -- | Collects pairs of arrays and indices that appear together in some @select@ and/or @store@ within an expression-accesses :: forall f (s :: Sort). ( ArrayF :<: f, ITraversable f ) => IFix f s -> [ArrayAccess f]+accesses :: forall f (s :: Sort). ( ArrayF :<: f, ITraversable f ) => IFix f s -> [DynamicallyIndexedArrayAccess f] accesses = execWriter . imapM accesses' where- accesses' :: forall (s' :: Sort). IFix f s' -> Writer [ArrayAccess f] (IFix f s')+ accesses' :: forall (s' :: Sort). IFix f s' -> Writer [DynamicallyIndexedArrayAccess f] (IFix f s') accesses' e = do case match e of- Just (Select is es a i) -> tell [ DynamicallySorted is (IT2 (Array2 (DynamicallySorted es (Array1 a)), i)) ]- Just (Store is es a i _) -> tell [ DynamicallySorted is (IT2 (Array2 (DynamicallySorted es (Array1 a)), i)) ]+ Just (Select is es a i) -> tell [ DynamicallyIndexedArrayAccess (DynamicallySorted is (StaticallyIndexedArrayAccess (IT2 (DynamicallyValuedArrayAccess (DynamicallySorted es (StaticallyValuedArrayAccess a)), i)))) ]+ Just (Store is es a i _) -> tell [ DynamicallyIndexedArrayAccess (DynamicallySorted is (StaticallyIndexedArrayAccess (IT2 (DynamicallyValuedArrayAccess (DynamicallySorted es (StaticallyValuedArrayAccess a)), i)))) ] _ -> return () return e