{-# LANGUAGE LambdaCase,
PatternSynonyms,
ViewPatterns #-}
module Parsley.Internal.Frontend.Optimiser (optimise) where
import Prelude hiding ((<$>))
import Parsley.Internal.Common (Fix(In), Quapplicative(..))
import Parsley.Internal.Core.CombinatorAST (Combinator(..))
import Parsley.Internal.Core.Defunc (Defunc(..), pattern FLIP_H, pattern COMPOSE_H, pattern FLIP_CONST, pattern UNIT)
pattern (:<$>:) :: Defunc (a -> b) -> Fix Combinator a -> Combinator (Fix Combinator) b
pattern f $b:<$>: :: Defunc (a -> b)
-> Fix Combinator a -> Combinator (Fix Combinator) b
$m:<$>: :: forall r b.
Combinator (Fix Combinator) b
-> (forall a. Defunc (a -> b) -> Fix Combinator a -> r)
-> (Void# -> r)
-> r
:<$>: p = In (Pure f) :<*>: p
pattern (:$>:) :: Fix Combinator a -> Defunc b -> Combinator (Fix Combinator) b
pattern p $b:$>: :: Fix Combinator a -> Defunc b -> Combinator (Fix Combinator) b
$m:$>: :: forall r b.
Combinator (Fix Combinator) b
-> (forall a. Fix Combinator a -> Defunc b -> r)
-> (Void# -> r)
-> r
:$>: x = p :*>: In (Pure x)
pattern (:<$:) :: Defunc a -> Fix Combinator b -> Combinator (Fix Combinator) a
pattern x $b:<$: :: Defunc a -> Fix Combinator b -> Combinator (Fix Combinator) a
$m:<$: :: forall r a.
Combinator (Fix Combinator) a
-> (forall b. Defunc a -> Fix Combinator b -> r)
-> (Void# -> r)
-> r
:<$: p = In (Pure x) :<*: p
optimise :: Combinator (Fix Combinator) a -> Fix Combinator a
optimise :: Combinator (Fix Combinator) a -> Fix Combinator a
optimise (In Combinator (Fix Combinator) (a -> a)
Empty :<*>: Fix Combinator a
_) = Combinator (Fix Combinator) a -> Fix Combinator a
forall k (f :: (k -> Type) -> k -> Type) (a :: k).
f (Fix f) a -> Fix f a
In Combinator (Fix Combinator) a
forall (k :: Type -> Type) a. Combinator k a
Empty
optimise (Fix Combinator (a -> a)
u :<*>: In Combinator (Fix Combinator) a
Empty) = Combinator (Fix Combinator) a -> Fix Combinator a
forall a. Combinator (Fix Combinator) a -> Fix Combinator a
optimise (Fix Combinator (a -> a)
u Fix Combinator (a -> a)
-> Fix Combinator a -> Combinator (Fix Combinator) a
forall (k :: Type -> Type) a b. k a -> k b -> Combinator k b
:*>: Combinator (Fix Combinator) a -> Fix Combinator a
forall k (f :: (k -> Type) -> k -> Type) (a :: k).
f (Fix f) a -> Fix f a
In Combinator (Fix Combinator) a
forall (k :: Type -> Type) a. Combinator k a
Empty)
optimise (In Combinator (Fix Combinator) a
Empty :*>: Fix Combinator a
_) = Combinator (Fix Combinator) a -> Fix Combinator a
forall k (f :: (k -> Type) -> k -> Type) (a :: k).
f (Fix f) a -> Fix f a
In Combinator (Fix Combinator) a
forall (k :: Type -> Type) a. Combinator k a
Empty
optimise (In Combinator (Fix Combinator) a
Empty :<*: Fix Combinator b
_) = Combinator (Fix Combinator) a -> Fix Combinator a
forall k (f :: (k -> Type) -> k -> Type) (a :: k).
f (Fix f) a -> Fix f a
In Combinator (Fix Combinator) a
forall (k :: Type -> Type) a. Combinator k a
Empty
optimise (Fix Combinator a
u :<*: In Combinator (Fix Combinator) b
Empty) = Combinator (Fix Combinator) a -> Fix Combinator a
forall a. Combinator (Fix Combinator) a -> Fix Combinator a
optimise (Fix Combinator a
u Fix Combinator a
-> Fix Combinator a -> Combinator (Fix Combinator) a
forall (k :: Type -> Type) a b. k a -> k b -> Combinator k b
:*>: Combinator (Fix Combinator) a -> Fix Combinator a
forall k (f :: (k -> Type) -> k -> Type) (a :: k).
f (Fix f) a -> Fix f a
In Combinator (Fix Combinator) a
forall (k :: Type -> Type) a. Combinator k a
Empty)
optimise (Branch (In Combinator (Fix Combinator) (Either a b)
Empty) Fix Combinator (a -> a)
_ Fix Combinator (b -> a)
_) = Combinator (Fix Combinator) a -> Fix Combinator a
forall k (f :: (k -> Type) -> k -> Type) (a :: k).
f (Fix f) a -> Fix f a
In Combinator (Fix Combinator) a
forall (k :: Type -> Type) a. Combinator k a
Empty
optimise (Branch Fix Combinator (Either a b)
b (In Combinator (Fix Combinator) (a -> a)
Empty) (In Combinator (Fix Combinator) (b -> a)
Empty)) = Combinator (Fix Combinator) a -> Fix Combinator a
forall a. Combinator (Fix Combinator) a -> Fix Combinator a
optimise (Fix Combinator (Either a b)
b Fix Combinator (Either a b)
-> Fix Combinator a -> Combinator (Fix Combinator) a
forall (k :: Type -> Type) a b. k a -> k b -> Combinator k b
:*>: Combinator (Fix Combinator) a -> Fix Combinator a
forall k (f :: (k -> Type) -> k -> Type) (a :: k).
f (Fix f) a -> Fix f a
In Combinator (Fix Combinator) a
forall (k :: Type -> Type) a. Combinator k a
Empty)
optimise (Match (In Combinator (Fix Combinator) a
Empty) [Defunc (a -> Bool)]
_ [Fix Combinator a]
_ Fix Combinator a
def) = Fix Combinator a
def
optimise (Match Fix Combinator a
p [Defunc (a -> Bool)]
_ [Fix Combinator a]
qs (In Combinator (Fix Combinator) a
Empty))
| (Fix Combinator a -> Bool) -> [Fix Combinator a] -> Bool
forall (t :: Type -> Type) a.
Foldable t =>
(a -> Bool) -> t a -> Bool
all (\case {In Combinator (Fix Combinator) a
Empty -> Bool
True; Fix Combinator a
_ -> Bool
False}) [Fix Combinator a]
qs = Combinator (Fix Combinator) a -> Fix Combinator a
forall a. Combinator (Fix Combinator) a -> Fix Combinator a
optimise (Fix Combinator a
p Fix Combinator a
-> Fix Combinator a -> Combinator (Fix Combinator) a
forall (k :: Type -> Type) a b. k a -> k b -> Combinator k b
:*>: Combinator (Fix Combinator) a -> Fix Combinator a
forall k (f :: (k -> Type) -> k -> Type) (a :: k).
f (Fix f) a -> Fix f a
In Combinator (Fix Combinator) a
forall (k :: Type -> Type) a. Combinator k a
Empty)
optimise (Defunc (a -> a)
ID :<$>: Fix Combinator a
u) = Fix Combinator a
Fix Combinator a
u
optimise (Defunc (a -> a)
FLIP_CONST :<$>: Fix Combinator a
u) = Combinator (Fix Combinator) (b -> b) -> Fix Combinator (b -> b)
forall a. Combinator (Fix Combinator) a -> Fix Combinator a
optimise (Fix Combinator a
u Fix Combinator a
-> Fix Combinator (b -> b) -> Combinator (Fix Combinator) (b -> b)
forall (k :: Type -> Type) a b. k a -> k b -> Combinator k b
:*>: Combinator (Fix Combinator) (b -> b) -> Fix Combinator (b -> b)
forall k (f :: (k -> Type) -> k -> Type) (a :: k).
f (Fix f) a -> Fix f a
In (Defunc (b -> b) -> Combinator (Fix Combinator) (b -> b)
forall a (k :: Type -> Type). Defunc a -> Combinator k a
Pure Defunc (b -> b)
forall a. Defunc (a -> a)
ID))
optimise (Defunc (a -> a)
f :<$>: In (Pure Defunc a
x)) = Combinator (Fix Combinator) a -> Fix Combinator a
forall k (f :: (k -> Type) -> k -> Type) (a :: k).
f (Fix f) a -> Fix f a
In (Defunc a -> Combinator (Fix Combinator) a
forall a (k :: Type -> Type). Defunc a -> Combinator k a
Pure (Defunc (a -> a) -> Defunc a -> Defunc a
forall a b. Defunc (a -> b) -> Defunc a -> Defunc b
APP_H Defunc (a -> a)
f Defunc a
x))
optimise (Defunc (a -> a)
f :<$>: In (Defunc (a -> a)
g :<$>: Fix Combinator a
p)) = Combinator (Fix Combinator) a -> Fix Combinator a
forall a. Combinator (Fix Combinator) a -> Fix Combinator a
optimise (Defunc (a -> a) -> Defunc (a -> a) -> Defunc (a -> a)
forall z x y b c a.
((x -> y -> z) ~ ((b -> c) -> (a -> b) -> a -> c)) =>
Defunc x -> Defunc y -> Defunc z
COMPOSE_H Defunc (a -> a)
f Defunc (a -> a)
g Defunc (a -> a)
-> Fix Combinator a -> Combinator (Fix Combinator) a
forall b a.
Defunc (a -> b)
-> Fix Combinator a -> Combinator (Fix Combinator) b
:<$>: Fix Combinator a
p)
optimise (Fix Combinator (a -> a)
u :<*>: In (Fix Combinator (a -> a)
v :<*>: Fix Combinator a
w)) = Combinator (Fix Combinator) a -> Fix Combinator a
forall a. Combinator (Fix Combinator) a -> Fix Combinator a
optimise (Combinator (Fix Combinator) (a -> a) -> Fix Combinator (a -> a)
forall a. Combinator (Fix Combinator) a -> Fix Combinator a
optimise (Combinator (Fix Combinator) ((a -> a) -> a -> a)
-> Fix Combinator ((a -> a) -> a -> a)
forall a. Combinator (Fix Combinator) a -> Fix Combinator a
optimise (Defunc ((a -> a) -> (a -> a) -> a -> a)
forall b c a. Defunc ((b -> c) -> (a -> b) -> a -> c)
COMPOSE Defunc ((a -> a) -> (a -> a) -> a -> a)
-> Fix Combinator (a -> a)
-> Combinator (Fix Combinator) ((a -> a) -> a -> a)
forall b a.
Defunc (a -> b)
-> Fix Combinator a -> Combinator (Fix Combinator) b
:<$>: Fix Combinator (a -> a)
u) Fix Combinator ((a -> a) -> a -> a)
-> Fix Combinator (a -> a) -> Combinator (Fix Combinator) (a -> a)
forall (k :: Type -> Type) a b. k (a -> b) -> k a -> Combinator k b
:<*>: Fix Combinator (a -> a)
v) Fix Combinator (a -> a)
-> Fix Combinator a -> Combinator (Fix Combinator) a
forall (k :: Type -> Type) a b. k (a -> b) -> k a -> Combinator k b
:<*>: Fix Combinator a
w)
optimise (In (Defunc (a -> a -> a)
FLIP_CONST :<$>: Fix Combinator a
p) :<*>: Fix Combinator a
q) = Combinator (Fix Combinator) a -> Fix Combinator a
forall k (f :: (k -> Type) -> k -> Type) (a :: k).
f (Fix f) a -> Fix f a
In (Fix Combinator a
p Fix Combinator a
-> Fix Combinator a -> Combinator (Fix Combinator) a
forall (k :: Type -> Type) a b. k a -> k b -> Combinator k b
:*>: Fix Combinator a
q)
optimise (In (Defunc (a -> a -> a)
CONST :<$>: Fix Combinator a
p) :<*>: Fix Combinator a
q) = Combinator (Fix Combinator) a -> Fix Combinator a
forall k (f :: (k -> Type) -> k -> Type) (a :: k).
f (Fix f) a -> Fix f a
In (Fix Combinator a
p Fix Combinator a
-> Fix Combinator a -> Combinator (Fix Combinator) a
forall (k :: Type -> Type) a b. k a -> k b -> Combinator k a
:<*: Fix Combinator a
q)
optimise (In (Fix Combinator a
u :*>: Fix Combinator (a -> a)
v) :<*>: Fix Combinator a
w) = Combinator (Fix Combinator) a -> Fix Combinator a
forall a. Combinator (Fix Combinator) a -> Fix Combinator a
optimise (Fix Combinator a
u Fix Combinator a
-> Fix Combinator a -> Combinator (Fix Combinator) a
forall (k :: Type -> Type) a b. k a -> k b -> Combinator k b
:*>: Combinator (Fix Combinator) a -> Fix Combinator a
forall a. Combinator (Fix Combinator) a -> Fix Combinator a
optimise (Fix Combinator (a -> a)
v Fix Combinator (a -> a)
-> Fix Combinator a -> Combinator (Fix Combinator) a
forall (k :: Type -> Type) a b. k (a -> b) -> k a -> Combinator k b
:<*>: Fix Combinator a
w))
optimise (Fix Combinator (a -> a)
u :<*>: In (Pure Defunc a
x)) = Combinator (Fix Combinator) a -> Fix Combinator a
forall a. Combinator (Fix Combinator) a -> Fix Combinator a
optimise (Defunc (a -> (a -> a) -> a) -> Defunc a -> Defunc ((a -> a) -> a)
forall a b. Defunc (a -> b) -> Defunc a -> Defunc b
APP_H (Defunc ((a -> a) -> a -> a) -> Defunc (a -> (a -> a) -> a)
forall y x a b c.
((x -> y) ~ ((a -> b -> c) -> b -> a -> c)) =>
Defunc x -> Defunc y
FLIP_H Defunc ((a -> a) -> a -> a)
forall a. Defunc (a -> a)
ID) Defunc a
x Defunc ((a -> a) -> a)
-> Fix Combinator (a -> a) -> Combinator (Fix Combinator) a
forall b a.
Defunc (a -> b)
-> Fix Combinator a -> Combinator (Fix Combinator) b
:<$>: Fix Combinator (a -> a)
u)
optimise (In (Defunc (a -> a)
_ :<$>: Fix Combinator a
p) :*>: Fix Combinator a
q) = Combinator (Fix Combinator) a -> Fix Combinator a
forall k (f :: (k -> Type) -> k -> Type) (a :: k).
f (Fix f) a -> Fix f a
In (Fix Combinator a
p Fix Combinator a
-> Fix Combinator a -> Combinator (Fix Combinator) a
forall (k :: Type -> Type) a b. k a -> k b -> Combinator k b
:*>: Fix Combinator a
q)
optimise (Fix Combinator a
p :<*: (In (Defunc (a -> b)
_ :<$>: Fix Combinator a
q))) = Combinator (Fix Combinator) a -> Fix Combinator a
forall k (f :: (k -> Type) -> k -> Type) (a :: k).
f (Fix f) a -> Fix f a
In (Fix Combinator a
p Fix Combinator a
-> Fix Combinator a -> Combinator (Fix Combinator) a
forall (k :: Type -> Type) a b. k a -> k b -> Combinator k a
:<*: Fix Combinator a
q)
optimise (Fix Combinator (a -> a)
u :<*>: In (Fix Combinator a
v :<*: Fix Combinator b
w)) = Combinator (Fix Combinator) a -> Fix Combinator a
forall a. Combinator (Fix Combinator) a -> Fix Combinator a
optimise (Combinator (Fix Combinator) a -> Fix Combinator a
forall a. Combinator (Fix Combinator) a -> Fix Combinator a
optimise (Fix Combinator (a -> a)
u Fix Combinator (a -> a)
-> Fix Combinator a -> Combinator (Fix Combinator) a
forall (k :: Type -> Type) a b. k (a -> b) -> k a -> Combinator k b
:<*>: Fix Combinator a
v) Fix Combinator a
-> Fix Combinator b -> Combinator (Fix Combinator) a
forall (k :: Type -> Type) a b. k a -> k b -> Combinator k a
:<*: Fix Combinator b
w)
optimise (Fix Combinator (a -> a)
u :<*>: In (Fix Combinator a
v :$>: Defunc a
x)) = Combinator (Fix Combinator) a -> Fix Combinator a
forall a. Combinator (Fix Combinator) a -> Fix Combinator a
optimise (Combinator (Fix Combinator) a -> Fix Combinator a
forall a. Combinator (Fix Combinator) a -> Fix Combinator a
optimise (Fix Combinator (a -> a)
u Fix Combinator (a -> a)
-> Fix Combinator a -> Combinator (Fix Combinator) a
forall (k :: Type -> Type) a b. k (a -> b) -> k a -> Combinator k b
:<*>: Combinator (Fix Combinator) a -> Fix Combinator a
forall k (f :: (k -> Type) -> k -> Type) (a :: k).
f (Fix f) a -> Fix f a
In (Defunc a -> Combinator (Fix Combinator) a
forall a (k :: Type -> Type). Defunc a -> Combinator k a
Pure Defunc a
x)) Fix Combinator a
-> Fix Combinator a -> Combinator (Fix Combinator) a
forall (k :: Type -> Type) a b. k a -> k b -> Combinator k a
:<*: Fix Combinator a
v)
optimise (p :: Fix Combinator a
p@(In (Pure Defunc a
_)) :<|>: Fix Combinator a
_) = Fix Combinator a
p
optimise (In Combinator (Fix Combinator) a
Empty :<|>: Fix Combinator a
u) = Fix Combinator a
u
optimise (Fix Combinator a
u :<|>: In Combinator (Fix Combinator) a
Empty) = Fix Combinator a
u
optimise (In (Fix Combinator a
u :<|>: Fix Combinator a
v) :<|>: Fix Combinator a
w) = Combinator (Fix Combinator) a -> Fix Combinator a
forall k (f :: (k -> Type) -> k -> Type) (a :: k).
f (Fix f) a -> Fix f a
In (Fix Combinator a
u Fix Combinator a
-> Fix Combinator a -> Combinator (Fix Combinator) a
forall (k :: Type -> Type) a. k a -> k a -> Combinator k a
:<|>: Combinator (Fix Combinator) a -> Fix Combinator a
forall a. Combinator (Fix Combinator) a -> Fix Combinator a
optimise (Fix Combinator a
v Fix Combinator a
-> Fix Combinator a -> Combinator (Fix Combinator) a
forall (k :: Type -> Type) a. k a -> k a -> Combinator k a
:<|>: Fix Combinator a
w))
optimise (In (Pure Defunc a
_) :*>: Fix Combinator a
u) = Fix Combinator a
u
optimise (In (Fix Combinator a
u :$>: Defunc a
_) :*>: Fix Combinator a
v) = Combinator (Fix Combinator) a -> Fix Combinator a
forall k (f :: (k -> Type) -> k -> Type) (a :: k).
f (Fix f) a -> Fix f a
In (Fix Combinator a
u Fix Combinator a
-> Fix Combinator a -> Combinator (Fix Combinator) a
forall (k :: Type -> Type) a b. k a -> k b -> Combinator k b
:*>: Fix Combinator a
v)
optimise (Fix Combinator a
u :*>: In (Fix Combinator a
v :*>: Fix Combinator a
w)) = Combinator (Fix Combinator) a -> Fix Combinator a
forall a. Combinator (Fix Combinator) a -> Fix Combinator a
optimise (Combinator (Fix Combinator) a -> Fix Combinator a
forall a. Combinator (Fix Combinator) a -> Fix Combinator a
optimise (Fix Combinator a
u Fix Combinator a
-> Fix Combinator a -> Combinator (Fix Combinator) a
forall (k :: Type -> Type) a b. k a -> k b -> Combinator k b
:*>: Fix Combinator a
v) Fix Combinator a
-> Fix Combinator a -> Combinator (Fix Combinator) a
forall (k :: Type -> Type) a b. k a -> k b -> Combinator k b
:*>: Fix Combinator a
w)
optimise (Fix Combinator a
u :<*: In (Pure Defunc b
_)) = Fix Combinator a
u
optimise (Fix Combinator a
u :<*: In (Fix Combinator a
v :$>: Defunc b
_)) = Combinator (Fix Combinator) a -> Fix Combinator a
forall a. Combinator (Fix Combinator) a -> Fix Combinator a
optimise (Fix Combinator a
u Fix Combinator a
-> Fix Combinator a -> Combinator (Fix Combinator) a
forall (k :: Type -> Type) a b. k a -> k b -> Combinator k a
:<*: Fix Combinator a
v)
optimise (Defunc a
x :<$: Fix Combinator b
u) = Combinator (Fix Combinator) a -> Fix Combinator a
forall a. Combinator (Fix Combinator) a -> Fix Combinator a
optimise (Fix Combinator b
u Fix Combinator b -> Defunc a -> Combinator (Fix Combinator) a
forall b a.
Fix Combinator a -> Defunc b -> Combinator (Fix Combinator) b
:$>: Defunc a
x)
optimise (In (Fix Combinator a
u :<*: Fix Combinator b
v) :<*: Fix Combinator b
w) = Combinator (Fix Combinator) a -> Fix Combinator a
forall a. Combinator (Fix Combinator) a -> Fix Combinator a
optimise (Fix Combinator a
u Fix Combinator a
-> Fix Combinator b -> Combinator (Fix Combinator) a
forall (k :: Type -> Type) a b. k a -> k b -> Combinator k a
:<*: Combinator (Fix Combinator) b -> Fix Combinator b
forall a. Combinator (Fix Combinator) a -> Fix Combinator a
optimise (Fix Combinator b
v Fix Combinator b
-> Fix Combinator b -> Combinator (Fix Combinator) b
forall (k :: Type -> Type) a b. k a -> k b -> Combinator k a
:<*: Fix Combinator b
w))
optimise (LookAhead p :: Fix Combinator a
p@(In (Pure Defunc a
_))) = Fix Combinator a
p
optimise (LookAhead p :: Fix Combinator a
p@(In Combinator (Fix Combinator) a
Empty)) = Fix Combinator a
p
optimise (NotFollowedBy (In (Pure Defunc a
_))) = Combinator (Fix Combinator) a -> Fix Combinator a
forall k (f :: (k -> Type) -> k -> Type) (a :: k).
f (Fix f) a -> Fix f a
In Combinator (Fix Combinator) a
forall (k :: Type -> Type) a. Combinator k a
Empty
optimise (NotFollowedBy (In Combinator (Fix Combinator) a
Empty)) = Combinator (Fix Combinator) () -> Fix Combinator ()
forall k (f :: (k -> Type) -> k -> Type) (a :: k).
f (Fix f) a -> Fix f a
In (Defunc () -> Combinator (Fix Combinator) ()
forall a (k :: Type -> Type). Defunc a -> Combinator k a
Pure Defunc ()
UNIT)
optimise (NotFollowedBy (In (NotFollowedBy Fix Combinator a
p))) = Combinator (Fix Combinator) () -> Fix Combinator ()
forall a. Combinator (Fix Combinator) a -> Fix Combinator a
optimise (Fix Combinator () -> Combinator (Fix Combinator) ()
forall (k :: Type -> Type) a. k a -> Combinator k a
LookAhead (Combinator (Fix Combinator) () -> Fix Combinator ()
forall k (f :: (k -> Type) -> k -> Type) (a :: k).
f (Fix f) a -> Fix f a
In (Combinator (Fix Combinator) a -> Fix Combinator a
forall k (f :: (k -> Type) -> k -> Type) (a :: k).
f (Fix f) a -> Fix f a
In (Fix Combinator a -> Combinator (Fix Combinator) a
forall (k :: Type -> Type) a. k a -> Combinator k a
Try Fix Combinator a
p) Fix Combinator a
-> Fix Combinator () -> Combinator (Fix Combinator) ()
forall (k :: Type -> Type) a b. k a -> k b -> Combinator k b
:*>: Combinator (Fix Combinator) () -> Fix Combinator ()
forall k (f :: (k -> Type) -> k -> Type) (a :: k).
f (Fix f) a -> Fix f a
In (Defunc () -> Combinator (Fix Combinator) ()
forall a (k :: Type -> Type). Defunc a -> Combinator k a
Pure Defunc ()
UNIT))))
optimise (NotFollowedBy (In (Try Fix Combinator a
p))) = Combinator (Fix Combinator) () -> Fix Combinator ()
forall a. Combinator (Fix Combinator) a -> Fix Combinator a
optimise (Fix Combinator a -> Combinator (Fix Combinator) ()
forall (k :: Type -> Type) a. k a -> Combinator k ()
NotFollowedBy Fix Combinator a
p)
optimise (LookAhead (In (LookAhead Fix Combinator a
p))) = Combinator (Fix Combinator) a -> Fix Combinator a
forall k (f :: (k -> Type) -> k -> Type) (a :: k).
f (Fix f) a -> Fix f a
In (Fix Combinator a -> Combinator (Fix Combinator) a
forall (k :: Type -> Type) a. k a -> Combinator k a
LookAhead Fix Combinator a
p)
optimise (NotFollowedBy (In (LookAhead Fix Combinator a
p))) = Combinator (Fix Combinator) () -> Fix Combinator ()
forall a. Combinator (Fix Combinator) a -> Fix Combinator a
optimise (Fix Combinator a -> Combinator (Fix Combinator) ()
forall (k :: Type -> Type) a. k a -> Combinator k ()
NotFollowedBy Fix Combinator a
p)
optimise (LookAhead (In (NotFollowedBy Fix Combinator a
p))) = Combinator (Fix Combinator) () -> Fix Combinator ()
forall k (f :: (k -> Type) -> k -> Type) (a :: k).
f (Fix f) a -> Fix f a
In (Fix Combinator a -> Combinator (Fix Combinator) ()
forall (k :: Type -> Type) a. k a -> Combinator k ()
NotFollowedBy Fix Combinator a
p)
optimise (NotFollowedBy (In (In (Try Fix Combinator a
p) :<|>: Fix Combinator a
q))) = Combinator (Fix Combinator) () -> Fix Combinator ()
forall a. Combinator (Fix Combinator) a -> Fix Combinator a
optimise (Combinator (Fix Combinator) () -> Fix Combinator ()
forall a. Combinator (Fix Combinator) a -> Fix Combinator a
optimise (Fix Combinator a -> Combinator (Fix Combinator) ()
forall (k :: Type -> Type) a. k a -> Combinator k ()
NotFollowedBy Fix Combinator a
p) Fix Combinator ()
-> Fix Combinator () -> Combinator (Fix Combinator) ()
forall (k :: Type -> Type) a b. k a -> k b -> Combinator k b
:*>: Combinator (Fix Combinator) () -> Fix Combinator ()
forall a. Combinator (Fix Combinator) a -> Fix Combinator a
optimise (Fix Combinator a -> Combinator (Fix Combinator) ()
forall (k :: Type -> Type) a. k a -> Combinator k ()
NotFollowedBy Fix Combinator a
q))
optimise (In (LookAhead Fix Combinator a
p) :<|>: In (LookAhead Fix Combinator a
q)) = Combinator (Fix Combinator) a -> Fix Combinator a
forall a. Combinator (Fix Combinator) a -> Fix Combinator a
optimise (Fix Combinator a -> Combinator (Fix Combinator) a
forall (k :: Type -> Type) a. k a -> Combinator k a
LookAhead (Combinator (Fix Combinator) a -> Fix Combinator a
forall a. Combinator (Fix Combinator) a -> Fix Combinator a
optimise (Combinator (Fix Combinator) a -> Fix Combinator a
forall k (f :: (k -> Type) -> k -> Type) (a :: k).
f (Fix f) a -> Fix f a
In (Fix Combinator a -> Combinator (Fix Combinator) a
forall (k :: Type -> Type) a. k a -> Combinator k a
Try Fix Combinator a
p) Fix Combinator a
-> Fix Combinator a -> Combinator (Fix Combinator) a
forall (k :: Type -> Type) a. k a -> k a -> Combinator k a
:<|>: Fix Combinator a
q)))
optimise (LookAhead (In (Fix Combinator a
p :$>: Defunc a
x))) = Combinator (Fix Combinator) a -> Fix Combinator a
forall a. Combinator (Fix Combinator) a -> Fix Combinator a
optimise (Combinator (Fix Combinator) a -> Fix Combinator a
forall a. Combinator (Fix Combinator) a -> Fix Combinator a
optimise (Fix Combinator a -> Combinator (Fix Combinator) a
forall (k :: Type -> Type) a. k a -> Combinator k a
LookAhead Fix Combinator a
p) Fix Combinator a -> Defunc a -> Combinator (Fix Combinator) a
forall b a.
Fix Combinator a -> Defunc b -> Combinator (Fix Combinator) b
:$>: Defunc a
x)
optimise (LookAhead (In (Defunc (a -> a)
f :<$>: Fix Combinator a
p))) = Combinator (Fix Combinator) a -> Fix Combinator a
forall a. Combinator (Fix Combinator) a -> Fix Combinator a
optimise (Defunc (a -> a)
f Defunc (a -> a)
-> Fix Combinator a -> Combinator (Fix Combinator) a
forall b a.
Defunc (a -> b)
-> Fix Combinator a -> Combinator (Fix Combinator) b
:<$>: Combinator (Fix Combinator) a -> Fix Combinator a
forall a. Combinator (Fix Combinator) a -> Fix Combinator a
optimise (Fix Combinator a -> Combinator (Fix Combinator) a
forall (k :: Type -> Type) a. k a -> Combinator k a
LookAhead Fix Combinator a
p))
optimise (Fix Combinator (a -> a)
p :<*>: In (NotFollowedBy Fix Combinator a
q)) = Combinator (Fix Combinator) a -> Fix Combinator a
forall a. Combinator (Fix Combinator) a -> Fix Combinator a
optimise (Combinator (Fix Combinator) a -> Fix Combinator a
forall a. Combinator (Fix Combinator) a -> Fix Combinator a
optimise (Fix Combinator (a -> a)
p Fix Combinator (a -> a)
-> Fix Combinator a -> Combinator (Fix Combinator) a
forall (k :: Type -> Type) a b. k (a -> b) -> k a -> Combinator k b
:<*>: Combinator (Fix Combinator) () -> Fix Combinator ()
forall k (f :: (k -> Type) -> k -> Type) (a :: k).
f (Fix f) a -> Fix f a
In (Defunc () -> Combinator (Fix Combinator) ()
forall a (k :: Type -> Type). Defunc a -> Combinator k a
Pure Defunc ()
UNIT)) Fix Combinator a
-> Fix Combinator () -> Combinator (Fix Combinator) a
forall (k :: Type -> Type) a b. k a -> k b -> Combinator k a
:<*: Combinator (Fix Combinator) () -> Fix Combinator ()
forall k (f :: (k -> Type) -> k -> Type) (a :: k).
f (Fix f) a -> Fix f a
In (Fix Combinator a -> Combinator (Fix Combinator) ()
forall (k :: Type -> Type) a. k a -> Combinator k ()
NotFollowedBy Fix Combinator a
q))
optimise (NotFollowedBy (In (Fix Combinator a
p :$>: Defunc a
_))) = Combinator (Fix Combinator) () -> Fix Combinator ()
forall a. Combinator (Fix Combinator) a -> Fix Combinator a
optimise (Fix Combinator a -> Combinator (Fix Combinator) ()
forall (k :: Type -> Type) a. k a -> Combinator k ()
NotFollowedBy Fix Combinator a
p)
optimise (NotFollowedBy (In (Defunc (a -> a)
_ :<$>: Fix Combinator a
p))) = Combinator (Fix Combinator) () -> Fix Combinator ()
forall a. Combinator (Fix Combinator) a -> Fix Combinator a
optimise (Fix Combinator a -> Combinator (Fix Combinator) ()
forall (k :: Type -> Type) a. k a -> Combinator k ()
NotFollowedBy Fix Combinator a
p)
optimise (Try (In (Fix Combinator a
p :$>: Defunc a
x))) = Combinator (Fix Combinator) a -> Fix Combinator a
forall a. Combinator (Fix Combinator) a -> Fix Combinator a
optimise (Combinator (Fix Combinator) a -> Fix Combinator a
forall a. Combinator (Fix Combinator) a -> Fix Combinator a
optimise (Fix Combinator a -> Combinator (Fix Combinator) a
forall (k :: Type -> Type) a. k a -> Combinator k a
Try Fix Combinator a
p) Fix Combinator a -> Defunc a -> Combinator (Fix Combinator) a
forall b a.
Fix Combinator a -> Defunc b -> Combinator (Fix Combinator) b
:$>: Defunc a
x)
optimise (Try (In (Defunc (a -> a)
f :<$>: Fix Combinator a
p))) = Combinator (Fix Combinator) a -> Fix Combinator a
forall a. Combinator (Fix Combinator) a -> Fix Combinator a
optimise (Defunc (a -> a)
f Defunc (a -> a)
-> Fix Combinator a -> Combinator (Fix Combinator) a
forall b a.
Defunc (a -> b)
-> Fix Combinator a -> Combinator (Fix Combinator) b
:<$>: Combinator (Fix Combinator) a -> Fix Combinator a
forall a. Combinator (Fix Combinator) a -> Fix Combinator a
optimise (Fix Combinator a -> Combinator (Fix Combinator) a
forall (k :: Type -> Type) a. k a -> Combinator k a
Try Fix Combinator a
p))
optimise (Branch (In (Pure l :: Defunc (Either a b)
l@(Defunc (Either a b) -> Either a b
forall (q :: Type -> Type) a. Quapplicative q => q a -> a
_val -> Left a
x))) Fix Combinator (a -> a)
p Fix Combinator (b -> a)
_) = Combinator (Fix Combinator) a -> Fix Combinator a
forall a. Combinator (Fix Combinator) a -> Fix Combinator a
optimise (Fix Combinator (a -> a)
p Fix Combinator (a -> a)
-> Fix Combinator a -> Combinator (Fix Combinator) a
forall (k :: Type -> Type) a b. k (a -> b) -> k a -> Combinator k b
:<*>: Combinator (Fix Combinator) a -> Fix Combinator a
forall k (f :: (k -> Type) -> k -> Type) (a :: k).
f (Fix f) a -> Fix f a
In (Defunc a -> Combinator (Fix Combinator) a
forall a (k :: Type -> Type). Defunc a -> Combinator k a
Pure (a -> Code a -> Defunc a
forall (q :: Type -> Type) a. Quapplicative q => a -> Code a -> q a
makeQ a
x Code a
qx))) where qx :: Code a
qx = [||case $$(_code l) of Left x -> x||]
optimise (Branch (In (Pure r :: Defunc (Either a b)
r@(Defunc (Either a b) -> Either a b
forall (q :: Type -> Type) a. Quapplicative q => q a -> a
_val -> Right b
x))) Fix Combinator (a -> a)
_ Fix Combinator (b -> a)
q) = Combinator (Fix Combinator) a -> Fix Combinator a
forall a. Combinator (Fix Combinator) a -> Fix Combinator a
optimise (Fix Combinator (b -> a)
q Fix Combinator (b -> a)
-> Fix Combinator b -> Combinator (Fix Combinator) a
forall (k :: Type -> Type) a b. k (a -> b) -> k a -> Combinator k b
:<*>: Combinator (Fix Combinator) b -> Fix Combinator b
forall k (f :: (k -> Type) -> k -> Type) (a :: k).
f (Fix f) a -> Fix f a
In (Defunc b -> Combinator (Fix Combinator) b
forall a (k :: Type -> Type). Defunc a -> Combinator k a
Pure (b -> Code b -> Defunc b
forall (q :: Type -> Type) a. Quapplicative q => a -> Code a -> q a
makeQ b
x Code b
qx))) where qx :: Code b
qx = [||case $$(_code r) of Right x -> x||]
optimise (Branch Fix Combinator (Either a b)
b (In (Pure Defunc (a -> a)
f)) (In (Pure Defunc (b -> a)
g))) = Combinator (Fix Combinator) a -> Fix Combinator a
forall a. Combinator (Fix Combinator) a -> Fix Combinator a
optimise ((Either a b -> a)
-> Code (Either a b -> a) -> Defunc (Either a b -> a)
forall (q :: Type -> Type) a. Quapplicative q => a -> Code a -> q a
makeQ ((a -> a) -> (b -> a) -> Either a b -> a
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either (Defunc (a -> a) -> a -> a
forall (q :: Type -> Type) a. Quapplicative q => q a -> a
_val Defunc (a -> a)
f) (Defunc (b -> a) -> b -> a
forall (q :: Type -> Type) a. Quapplicative q => q a -> a
_val Defunc (b -> a)
g)) [||either $$(_code f) $$(_code g)||] Defunc (Either a b -> a)
-> Fix Combinator (Either a b) -> Combinator (Fix Combinator) a
forall b a.
Defunc (a -> b)
-> Fix Combinator a -> Combinator (Fix Combinator) b
:<$>: Fix Combinator (Either a b)
b)
optimise (Branch (In (Fix Combinator a
x :*>: Fix Combinator (Either a b)
y)) Fix Combinator (a -> a)
p Fix Combinator (b -> a)
q) = Combinator (Fix Combinator) a -> Fix Combinator a
forall a. Combinator (Fix Combinator) a -> Fix Combinator a
optimise (Fix Combinator a
x Fix Combinator a
-> Fix Combinator a -> Combinator (Fix Combinator) a
forall (k :: Type -> Type) a b. k a -> k b -> Combinator k b
:*>: Combinator (Fix Combinator) a -> Fix Combinator a
forall a. Combinator (Fix Combinator) a -> Fix Combinator a
optimise (Fix Combinator (Either a b)
-> Fix Combinator (a -> a)
-> Fix Combinator (b -> a)
-> Combinator (Fix Combinator) a
forall (k :: Type -> Type) a b c.
k (Either a b) -> k (a -> c) -> k (b -> c) -> Combinator k c
Branch Fix Combinator (Either a b)
y Fix Combinator (a -> a)
p Fix Combinator (b -> a)
q))
optimise (Branch Fix Combinator (Either a b)
b Fix Combinator (a -> a)
p (In Combinator (Fix Combinator) (b -> a)
Empty)) = Combinator (Fix Combinator) a -> Fix Combinator a
forall k (f :: (k -> Type) -> k -> Type) (a :: k).
f (Fix f) a -> Fix f a
In (Fix Combinator (Either b a)
-> Fix Combinator (b -> a)
-> Fix Combinator (a -> a)
-> Combinator (Fix Combinator) a
forall (k :: Type -> Type) a b c.
k (Either a b) -> k (a -> c) -> k (b -> c) -> Combinator k c
Branch (Combinator (Fix Combinator) (Either b a)
-> Fix Combinator (Either b a)
forall k (f :: (k -> Type) -> k -> Type) (a :: k).
f (Fix f) a -> Fix f a
In (Combinator (Fix Combinator) (Either a b -> Either b a)
-> Fix Combinator (Either a b -> Either b a)
forall k (f :: (k -> Type) -> k -> Type) (a :: k).
f (Fix f) a -> Fix f a
In (Defunc (Either a b -> Either b a)
-> Combinator (Fix Combinator) (Either a b -> Either b a)
forall a (k :: Type -> Type). Defunc a -> Combinator k a
Pure ((Either a b -> Either b a)
-> Code (Either a b -> Either b a)
-> Defunc (Either a b -> Either b a)
forall (q :: Type -> Type) a. Quapplicative q => a -> Code a -> q a
makeQ ((a -> Either b a) -> (b -> Either b a) -> Either a b -> Either b a
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either a -> Either b a
forall a b. b -> Either a b
Right b -> Either b a
forall a b. a -> Either a b
Left) [||either Right Left||])) Fix Combinator (Either a b -> Either b a)
-> Fix Combinator (Either a b)
-> Combinator (Fix Combinator) (Either b a)
forall (k :: Type -> Type) a b. k (a -> b) -> k a -> Combinator k b
:<*>: Fix Combinator (Either a b)
b)) (Combinator (Fix Combinator) (b -> a) -> Fix Combinator (b -> a)
forall k (f :: (k -> Type) -> k -> Type) (a :: k).
f (Fix f) a -> Fix f a
In Combinator (Fix Combinator) (b -> a)
forall (k :: Type -> Type) a. Combinator k a
Empty) Fix Combinator (a -> a)
p)
optimise (Branch (In (Branch Fix Combinator (Either a b)
b (In Combinator (Fix Combinator) (a -> Either a b)
Empty) (In (Pure Defunc (b -> Either a b)
f)))) (In Combinator (Fix Combinator) (a -> a)
Empty) Fix Combinator (b -> a)
k) = Combinator (Fix Combinator) a -> Fix Combinator a
forall a. Combinator (Fix Combinator) a -> Fix Combinator a
optimise (Fix Combinator (Either () b)
-> Fix Combinator (() -> a)
-> Fix Combinator (b -> a)
-> Combinator (Fix Combinator) a
forall (k :: Type -> Type) a b c.
k (Either a b) -> k (a -> c) -> k (b -> c) -> Combinator k c
Branch (Combinator (Fix Combinator) (Either () b)
-> Fix Combinator (Either () b)
forall a. Combinator (Fix Combinator) a -> Fix Combinator a
optimise (Combinator (Fix Combinator) (Either a b -> Either () b)
-> Fix Combinator (Either a b -> Either () b)
forall k (f :: (k -> Type) -> k -> Type) (a :: k).
f (Fix f) a -> Fix f a
In (Defunc (Either a b -> Either () b)
-> Combinator (Fix Combinator) (Either a b -> Either () b)
forall a (k :: Type -> Type). Defunc a -> Combinator k a
Pure ((Either a b -> Either () b)
-> Code (Either a b -> Either () b)
-> Defunc (Either a b -> Either () b)
forall (q :: Type -> Type) a. Quapplicative q => a -> Code a -> q a
makeQ Either a b -> Either () b
g Code (Either a b -> Either () b)
qg)) Fix Combinator (Either a b -> Either () b)
-> Fix Combinator (Either a b)
-> Combinator (Fix Combinator) (Either () b)
forall (k :: Type -> Type) a b. k (a -> b) -> k a -> Combinator k b
:<*>: Fix Combinator (Either a b)
b)) (Combinator (Fix Combinator) (() -> a) -> Fix Combinator (() -> a)
forall k (f :: (k -> Type) -> k -> Type) (a :: k).
f (Fix f) a -> Fix f a
In Combinator (Fix Combinator) (() -> a)
forall (k :: Type -> Type) a. Combinator k a
Empty) Fix Combinator (b -> a)
k)
where
g :: Either a b -> Either () b
g (Left a
_) = () -> Either () b
forall a b. a -> Either a b
Left ()
g (Right b
x) = case Defunc (b -> Either a b) -> b -> Either a b
forall (q :: Type -> Type) a. Quapplicative q => q a -> a
_val Defunc (b -> Either a b)
f b
x of
Left a
_ -> () -> Either () b
forall a b. a -> Either a b
Left ()
Right b
x -> b -> Either () b
forall a b. b -> Either a b
Right b
x
qg :: Code (Either a b -> Either () b)
qg = [||\case Left _ -> Left ()
Right x -> case $$(_code f) x of
Left _ -> Left ()
Right y -> Right y||]
optimise (Defunc (a -> a)
f :<$>: In (Branch Fix Combinator (Either a b)
b Fix Combinator (a -> a)
p Fix Combinator (b -> a)
q)) = Combinator (Fix Combinator) a -> Fix Combinator a
forall a. Combinator (Fix Combinator) a -> Fix Combinator a
optimise (Fix Combinator (Either a b)
-> Fix Combinator (a -> a)
-> Fix Combinator (b -> a)
-> Combinator (Fix Combinator) a
forall (k :: Type -> Type) a b c.
k (Either a b) -> k (a -> c) -> k (b -> c) -> Combinator k c
Branch Fix Combinator (Either a b)
b (Combinator (Fix Combinator) (a -> a) -> Fix Combinator (a -> a)
forall a. Combinator (Fix Combinator) a -> Fix Combinator a
optimise (Defunc ((a -> a) -> (a -> a) -> a -> a)
-> Defunc (a -> a) -> Defunc ((a -> a) -> a -> a)
forall a b. Defunc (a -> b) -> Defunc a -> Defunc b
APP_H Defunc ((a -> a) -> (a -> a) -> a -> a)
forall b c a. Defunc ((b -> c) -> (a -> b) -> a -> c)
COMPOSE Defunc (a -> a)
f Defunc ((a -> a) -> a -> a)
-> Fix Combinator (a -> a) -> Combinator (Fix Combinator) (a -> a)
forall b a.
Defunc (a -> b)
-> Fix Combinator a -> Combinator (Fix Combinator) b
:<$>: Fix Combinator (a -> a)
p)) (Combinator (Fix Combinator) (b -> a) -> Fix Combinator (b -> a)
forall a. Combinator (Fix Combinator) a -> Fix Combinator a
optimise (Defunc ((a -> a) -> (b -> a) -> b -> a)
-> Defunc (a -> a) -> Defunc ((b -> a) -> b -> a)
forall a b. Defunc (a -> b) -> Defunc a -> Defunc b
APP_H Defunc ((a -> a) -> (b -> a) -> b -> a)
forall b c a. Defunc ((b -> c) -> (a -> b) -> a -> c)
COMPOSE Defunc (a -> a)
f Defunc ((b -> a) -> b -> a)
-> Fix Combinator (b -> a) -> Combinator (Fix Combinator) (b -> a)
forall b a.
Defunc (a -> b)
-> Fix Combinator a -> Combinator (Fix Combinator) b
:<$>: Fix Combinator (b -> a)
q)))
optimise (Match (In (Pure Defunc a
x)) [Defunc (a -> Bool)]
fs [Fix Combinator a]
qs Fix Combinator a
def) = ((Defunc (a -> Bool), Fix Combinator a)
-> Fix Combinator a -> Fix Combinator a)
-> Fix Combinator a
-> [(Defunc (a -> Bool), Fix Combinator a)]
-> Fix Combinator a
forall (t :: Type -> Type) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (\(Defunc (a -> Bool)
f, Fix Combinator a
q) Fix Combinator a
k -> if Defunc (a -> Bool) -> a -> Bool
forall (q :: Type -> Type) a. Quapplicative q => q a -> a
_val Defunc (a -> Bool)
f (Defunc a -> a
forall (q :: Type -> Type) a. Quapplicative q => q a -> a
_val Defunc a
x) then Fix Combinator a
q else Fix Combinator a
k) Fix Combinator a
def ([Defunc (a -> Bool)]
-> [Fix Combinator a] -> [(Defunc (a -> Bool), Fix Combinator a)]
forall a b. [a] -> [b] -> [(a, b)]
zip [Defunc (a -> Bool)]
fs [Fix Combinator a]
qs)
optimise (Defunc (a -> a)
f :<$>: (In (Match Fix Combinator a
p [Defunc (a -> Bool)]
fs [Fix Combinator a]
qs Fix Combinator a
def))) = Combinator (Fix Combinator) a -> Fix Combinator a
forall k (f :: (k -> Type) -> k -> Type) (a :: k).
f (Fix f) a -> Fix f a
In (Fix Combinator a
-> [Defunc (a -> Bool)]
-> [Fix Combinator a]
-> Fix Combinator a
-> Combinator (Fix Combinator) a
forall (k :: Type -> Type) a b.
k a -> [Defunc (a -> Bool)] -> [k b] -> k b -> Combinator k b
Match Fix Combinator a
p [Defunc (a -> Bool)]
fs ((Fix Combinator a -> Fix Combinator a)
-> [Fix Combinator a] -> [Fix Combinator a]
forall a b. (a -> b) -> [a] -> [b]
map (Combinator (Fix Combinator) a -> Fix Combinator a
forall a. Combinator (Fix Combinator) a -> Fix Combinator a
optimise (Combinator (Fix Combinator) a -> Fix Combinator a)
-> (Fix Combinator a -> Combinator (Fix Combinator) a)
-> Fix Combinator a
-> Fix Combinator a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Defunc (a -> a)
f Defunc (a -> a)
-> Fix Combinator a -> Combinator (Fix Combinator) a
forall b a.
Defunc (a -> b)
-> Fix Combinator a -> Combinator (Fix Combinator) b
:<$>:)) [Fix Combinator a]
qs) (Combinator (Fix Combinator) a -> Fix Combinator a
forall a. Combinator (Fix Combinator) a -> Fix Combinator a
optimise (Defunc (a -> a)
f Defunc (a -> a)
-> Fix Combinator a -> Combinator (Fix Combinator) a
forall b a.
Defunc (a -> b)
-> Fix Combinator a -> Combinator (Fix Combinator) b
:<$>: Fix Combinator a
def)))
optimise Combinator (Fix Combinator) a
p = Combinator (Fix Combinator) a -> Fix Combinator a
forall k (f :: (k -> Type) -> k -> Type) (a :: k).
f (Fix f) a -> Fix f a
In Combinator (Fix Combinator) a
p