iface: add interpreter `Reader`
authorJulien Moutinho <julm@sourcephile.fr>
Fri, 4 Mar 2022 16:31:43 +0000 (17:31 +0100)
committerJulien Moutinho <julm@sourcephile.fr>
Mon, 7 Mar 2022 00:26:29 +0000 (01:26 +0100)
src/Symantic.hs
src/Symantic/Reader.hs [new file with mode: 0644]
symantic-base.cabal

index 64bc821fedc470a796f43527be555db2a25d0219..3aa8b2074bf2390464a0890a60c63af38f1a36f6 100644 (file)
@@ -4,6 +4,7 @@ module Symantic
  , module Symantic.Data
  , module Symantic.Derive
  , module Symantic.Optimize
+ , module Symantic.Reader
  , module Symantic.Reify
  , module Symantic.SharingObserver
  , module Symantic.Viewer
@@ -14,6 +15,7 @@ import Symantic.CurryN
 import Symantic.Data
 import Symantic.Derive
 import Symantic.Optimize
+import Symantic.Reader
 import Symantic.Reify
 import Symantic.SharingObserver
 import Symantic.Viewer
diff --git a/src/Symantic/Reader.hs b/src/Symantic/Reader.hs
new file mode 100644 (file)
index 0000000..3973251
--- /dev/null
@@ -0,0 +1,50 @@
+module Symantic.Reader where
+
+import Data.Function ((.), const)
+
+import Symantic.Classes hiding (const, (.))
+import Symantic.Derive
+
+-- * Type 'Reader'
+-- | An intermediate interpreter exposing an environment.
+newtype Reader r repr a = Reader { unReader :: r -> repr a }
+
+type instance Derived (Reader r repr) = repr
+instance LiftDerived (Reader r repr) where
+  liftDerived = Reader . const
+instance LiftDerived1 (Reader r repr) where
+  liftDerived1 f a = Reader (f . unReader a)
+instance LiftDerived2 (Reader r repr) where
+  liftDerived2 f a b = Reader (\r -> f (unReader a r) (unReader b r))
+instance LiftDerived3 (Reader r repr) where
+  liftDerived3 f a b c = Reader (\r -> f (unReader a r) (unReader b r) (unReader c r))
+instance LiftDerived4 (Reader r repr) where
+  liftDerived4 f a b c d = Reader (\r -> f (unReader a r) (unReader b r) (unReader c r) (unReader d r))
+
+instance Abstractable repr => Abstractable (Reader r repr) where
+  lam f = Reader (\r -> lam ((`unReader` r) . f . liftDerived))
+  lam1 f = Reader (\r -> lam1 ((`unReader` r) . f . liftDerived))
+instance Functionable repr => Functionable (Reader r repr)
+instance Anythingable repr => Anythingable (Reader r repr)
+instance Constantable c repr => Constantable c (Reader r repr)
+instance Eitherable repr => Eitherable (Reader r repr)
+instance Equalable repr => Equalable (Reader r repr)
+instance IfThenElseable repr => IfThenElseable (Reader r repr)
+-- Using 'Inferable' with a specific @a@ and keeping @repr@ polymorphic
+-- is more usual; hence commenting this instance that would overlap.
+--instance Inferable a repr => Inferable a (Reader r repr)
+instance Listable repr => Listable (Reader r repr)
+instance Maybeable repr => Maybeable (Reader r repr)
+instance IsoFunctor repr => IsoFunctor (Reader r repr)
+instance (ProductFunctor repr, IsoFunctor repr) => ProductFunctor (Reader r repr)
+instance (SumFunctor repr, IsoFunctor repr) => SumFunctor (Reader r repr)
+instance AlternativeFunctor repr => AlternativeFunctor (Reader r repr)
+instance Dicurryable repr => Dicurryable (Reader r repr)
+instance Emptyable repr => Emptyable (Reader r repr)
+instance Semigroupable repr => Semigroupable (Reader r repr)
+instance Optionable repr => Optionable (Reader r repr)
+instance Repeatable repr => Repeatable (Reader r repr)
+-- instance Permutable repr => Permutable (Reader r repr)
+instance Routable repr => Routable (Reader r repr)
+instance Voidable repr => Voidable (Reader r repr)
+instance Substractable repr => Substractable (Reader r repr)
index 64c6fe5a1080504b4b2bb5e2443a120e78ecabe6..b7a8848e71b0889279c2fa3178ebe9d91d310df9 100644 (file)
@@ -10,7 +10,7 @@ license-file: LICENSES/AGPL-3.0-or-later.txt
 -- PVP:  +-+------- breaking API changes
 --       | | +----- non-breaking API additions
 --       | | | +--- code changes with no API change
-version: 0.4.0.20211106
+version: 0.4.1.20220304
 stability: experimental
 category: Data Structures
 synopsis: Basic symantic combinators for Embedded Domain-Specific Languages (EDSL)
@@ -76,6 +76,7 @@ library
     Symantic.Derive
     Symantic.Fixity
     Symantic.Optimize
+    Symantic.Reader
     Symantic.Reify
     Symantic.SharingObserver
     Symantic.Viewer