diff --git a/semialign/src/Data/Semialign/Internal.hs b/semialign/src/Data/Semialign/Internal.hs index ef2e9cf..2ba91a5 100644 --- a/semialign/src/Data/Semialign/Internal.hs +++ b/semialign/src/Data/Semialign/Internal.hs @@ -80,6 +80,7 @@ import Data.Semigroup (Option (..)) import Data.These import Data.These.Combinators +import Control.Monad.Trans.Reader (ReaderT (..)) oops :: String -> a oops = error . ("Data.Align: internal error: " ++) @@ -454,6 +455,12 @@ instance SemialignWithIndex Int ZipList instance ZipWithIndex Int ZipList instance RepeatWithIndex Int ZipList +instance Semialign m => Semialign (ReaderT r m) where + align ma mb = ReaderT $ getCompose $ align (Compose (runReaderT ma)) (Compose (runReaderT mb)) + +instance Align m => Align (ReaderT r m) where + nil = ReaderT $ Prelude.const nil + ------------------------------------------------------------------------------- -- semigroups ------------------------------------------------------------------------------- diff --git a/these-tests/test/Tests/Semialign.hs b/these-tests/test/Tests/Semialign.hs index 6c5e095..80a3ef0 100644 --- a/these-tests/test/Tests/Semialign.hs +++ b/these-tests/test/Tests/Semialign.hs @@ -91,6 +91,7 @@ alignProps = testGroup "Align" #ifdef MIN_VERSION_lattice -- note: with e.g. N5 (which isn't distributive lattice) distributivity laws fail! , semialignLaws (CZip :: CSemialign (Const M2)) + , semialignLaws (CAlign :: CSemialign (ReaderT Int [])) #endif ]