@@ -108,6 +108,7 @@ module Boggle
109import Control.Applicative
109import Control.Applicative
110import Control.Monad
110import Control.Monad
111+import GHC.Exts ( inline )
112infixl 4 <<$>, <<.>, <.>
113infixl 4 <<$>, <<.>, <.>
@@ -336,7 +337,7 @@ instance Applicative (Boggle f) where
337liftBoggle :: Applicative f => f a -> Boggle f a
338liftBoggle :: Applicative f => f a -> Boggle f a
338liftBoggle = Boggle . liftPureK . liftApK1 . liftMapK1 . liftApWrap
339liftBoggle = Boggle . liftPureK . liftApK1 . liftMapK1 . liftApWrap
339−{-# INLINE liftBoggle #-}
340+{-# INLINE[1] liftBoggle #-}
341-- | 'lowerBoggle' lowers the 'ApK1' and 'MapK' layers first before lowering
342-- | 'lowerBoggle' lowers the 'ApK1' and 'MapK' layers first before lowering
342-- the 'PureK' layer. This ensures that any 'fmap' uses in the 'PureK' layer
343-- the 'PureK' layer. This ensures that any 'fmap' uses in the 'PureK' layer
@@ -353,7 +354,7 @@ lowerBoggle
353-- This function will only work well on non-recursive traversals. For an example
354-- This function will only work well on non-recursive traversals. For an example
354-- of using this technique on recursive cases see "Data.Traversable.Generic".
355-- of using this technique on recursive cases see "Data.Traversable.Generic".
355boggling :: Applicative f => LensLike (Boggle f) s t a b -> LensLike f s t a b
356boggling :: Applicative f => LensLike (Boggle f) s t a b -> LensLike f s t a b
356−boggling l = \f x -> lowerBoggle (l (liftBoggle . f) x)
357+boggling l = \f x -> lowerBoggle (l (\x -> (liftBoggle (f x))) x)
357{-# INLINE boggling #-}
358{-# INLINE boggling #-}
@@ -397,3 +398,136 @@ traversePair f (a, b) = (,) <$> f a <*> f b
398test :: Applicative f => (a -> f a) -> (a, a) -> f (a, a)
399test :: Applicative f => (a -> f a) -> (a, a) -> f (a, a)
399test = boggling traversePair
400test = boggling traversePair
405+liftBoggle fa <*> (pure (5+) <*> liftBoggle fb)
407+((Boggle . liftPureK . liftApK1 . liftMapK1 . liftApWrap) fa)
409+ (pure (5+) <*> (Boggle . liftPureK . liftApK1 . liftMapK1 . liftApWrap) fb)
413+ ApK1 (MapK1 (ApWrap fa) (liftMapK (ApWrap fa))) (liftApK (MapK1 (ApWrap fa) (liftMapK (ApWrap fa))))))
415+ ( Boggle (Pure (5+))
419+ ApK1 (MapK1 (ApWrap fb) (liftMapK (ApWrap fb))) (liftApK (MapK1 (ApWrap fb) (liftMapK (ApWrap fb)))))))
422+ ApK1 (MapK1 (ApWrap fa) (liftMapK (ApWrap fa))) (liftApK (MapK1 (ApWrap fa) (liftMapK (ApWrap fa)))))))
425+ ApK1 (MapK1 (ApWrap fb) (liftMapK (ApWrap fb))) (liftApK (MapK1 (ApWrap fb) (liftMapK (ApWrap fb)))))))
429+ ApK1 (MapK1 (ApWrap fa) (liftMapK (ApWrap fa))) (liftApK (MapK1 (ApWrap fa) (liftMapK (ApWrap fa)))))))
432+ ApK1 (MapK1 (ApWrap fb) (liftMapK (ApWrap fb))) (liftApK (MapK1 (ApWrap fb) (liftMapK (ApWrap fb)))))))
437+ ApK1 (MapK1 (ApWrap fa) (liftMapK (ApWrap fa))) (liftApK (MapK1 (ApWrap fa) (liftMapK (ApWrap fa))))))
440+ ApK1 (MapK1 (ApWrap fb) (liftMapK (ApWrap fb))) (liftApK (MapK1 (ApWrap fb) (liftMapK (ApWrap fb)))))
445+ ApK1 (MapK1 (ApWrap fa) (liftMapK (ApWrap fa))) (liftApK (MapK1 (ApWrap fa) (liftMapK (ApWrap fa))))))
448+ ApK1 ((+5) <$> MapK1 (ApWrap fb) (liftMapK (ApWrap fb))) ((+5) <$> liftApK (MapK1 (ApWrap fb) (liftMapK (ApWrap fb)))))
455+ (MapK1 (ApWrap fa) (liftMapK (ApWrap fa)))
456+ <<.> ((+5) <$> liftApK (MapK1 (ApWrap fb) (liftMapK (ApWrap fb))))
457+ -- This isn't going to be evaluated
458+ ((liftApK (MapK1 (ApWrap fa) (liftMapK (ApWrap fa))))))
459+ <.> ((+5) <$> liftApK (MapK1 (ApWrap fb) (liftMapK (ApWrap fb)))))
460+= {- Remove unevaled term -}
464+ (MapK1 (ApWrap fa) (liftMapK (ApWrap fa)))
465+ <<.> ((+5) <$> liftApK (MapK1 (ApWrap fb) (liftMapK (ApWrap fb))))
467+= {- liftMapK defn -}
471+ (MapK1 (ApWrap fa) (liftMapK (ApWrap fa)))
472+ <<.> ((+5) <$> liftApK (MapK1 (ApWrap fb) (MapK (<$> (ApWrap fb))))
478+ (MapK1 (ApWrap fa) (liftMapK (ApWrap fa)))
479+ <<.> ((+5) <$> ApK (<.> (MapK1 (ApWrap fb) (MapK (<$> (ApWrap fb))))
484+ (MapK1 (ApWrap fa) (liftMapK (ApWrap fa)))
485+ <<.> (ApK (\g -> (\a b -> a (5 + b)) <$> g <<.>
486+ (ApK (<.> (MapK1 (ApWrap fb) (MapK (<$> (ApWrap fb)))))
491+ (MapK1 (ApWrap fa) (liftMapK (ApWrap fa)))
492+ <<.> (ApK (\g -> (\a b -> a (5 + b)) <$>
493+ (g <.> (MapK1 (ApWrap fb) (MapK (<$> (ApWrap fb))))))
498+ (\a b -> a (5 + b)) <$> (
499+ (MapK1 (ApWrap fa) (liftMapK (ApWrap fa)))
500+ <.> (MapK1 (ApWrap fb) (MapK (<$> (ApWrap fb))))))
505+ (\a b -> a (5 + b)) <$> (
506+ (MapK1 (ApWrap fa <.> ApWrap fb)
507+ (\k -> (\a b -> k (a b)) <<$> (MapK (<$> (ApWrap fa)))))
513+ (\a b -> a (5 + b)) <$> (
514+ (MapK1 (ApWrap fa <.> ApWrap fb)
515+ (ApWrap ((\k -> (\a b -> k (a b))) <$> fa <*> fb))))
522+ (\a b -> a (5 + b)) <$> ApWrap fa <.> ApWrap fb))))