{-# OPTIONS_HADDOCK hide #-}
{-# LANGUAGE Safe #-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE FunctionalDependencies #-}
module Features.Compose
(
FeatureData
, MissingReason(..)
, Feature
, F
, FeatureN
, featureDataL
, featureDataR
, missingBecause
, makeFeature
, getFeatureData
, getFData
, getData
, getDataN
, getNameN
, nameFeature
, Definition(..)
, Define(..)
, DefineA(..)
, Def
, eval
) where
import safe Control.Applicative ( (<$>)
, Applicative(..)
, liftA3
)
import safe Control.Monad ( (=<<)
, Functor(..)
, Monad(..)
, join
, liftM
, liftM2
, liftM3
, liftM4
)
import safe Data.Either ( Either(..) )
import safe Data.Eq ( Eq(..) )
import safe Data.Foldable ( Foldable(foldr)
, fold
)
import safe Data.Function ( ($)
, (.)
, id
)
import safe Data.List ( (++)
, concat
, transpose
)
import safe Data.Proxy ( Proxy(..) )
import safe Data.Text ( Text
, pack
)
import safe Data.Traversable ( Traversable(..) )
import safe GHC.Generics ( Generic )
import safe GHC.Show ( Show(show) )
import safe GHC.TypeLits ( KnownSymbol
, Symbol
, symbolVal
)
type F n a = Feature n a
type Def d = Definition d
data MissingReason =
InsufficientData
| Other Text
deriving (MissingReason -> MissingReason -> Bool
(MissingReason -> MissingReason -> Bool)
-> (MissingReason -> MissingReason -> Bool) -> Eq MissingReason
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: MissingReason -> MissingReason -> Bool
$c/= :: MissingReason -> MissingReason -> Bool
== :: MissingReason -> MissingReason -> Bool
$c== :: MissingReason -> MissingReason -> Bool
Eq, Int -> MissingReason -> ShowS
[MissingReason] -> ShowS
MissingReason -> String
(Int -> MissingReason -> ShowS)
-> (MissingReason -> String)
-> ([MissingReason] -> ShowS)
-> Show MissingReason
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [MissingReason] -> ShowS
$cshowList :: [MissingReason] -> ShowS
show :: MissingReason -> String
$cshow :: MissingReason -> String
showsPrec :: Int -> MissingReason -> ShowS
$cshowsPrec :: Int -> MissingReason -> ShowS
Show, (forall x. MissingReason -> Rep MissingReason x)
-> (forall x. Rep MissingReason x -> MissingReason)
-> Generic MissingReason
forall x. Rep MissingReason x -> MissingReason
forall x. MissingReason -> Rep MissingReason x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep MissingReason x -> MissingReason
$cfrom :: forall x. MissingReason -> Rep MissingReason x
Generic)
newtype FeatureData d = MkFeatureData {
FeatureData d -> Either MissingReason d
getFeatureData :: Either MissingReason d
}
deriving (FeatureData d -> FeatureData d -> Bool
(FeatureData d -> FeatureData d -> Bool)
-> (FeatureData d -> FeatureData d -> Bool) -> Eq (FeatureData d)
forall d. Eq d => FeatureData d -> FeatureData d -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: FeatureData d -> FeatureData d -> Bool
$c/= :: forall d. Eq d => FeatureData d -> FeatureData d -> Bool
== :: FeatureData d -> FeatureData d -> Bool
$c== :: forall d. Eq d => FeatureData d -> FeatureData d -> Bool
Eq, Int -> FeatureData d -> ShowS
[FeatureData d] -> ShowS
FeatureData d -> String
(Int -> FeatureData d -> ShowS)
-> (FeatureData d -> String)
-> ([FeatureData d] -> ShowS)
-> Show (FeatureData d)
forall d. Show d => Int -> FeatureData d -> ShowS
forall d. Show d => [FeatureData d] -> ShowS
forall d. Show d => FeatureData d -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [FeatureData d] -> ShowS
$cshowList :: forall d. Show d => [FeatureData d] -> ShowS
show :: FeatureData d -> String
$cshow :: forall d. Show d => FeatureData d -> String
showsPrec :: Int -> FeatureData d -> ShowS
$cshowsPrec :: forall d. Show d => Int -> FeatureData d -> ShowS
Show, (forall x. FeatureData d -> Rep (FeatureData d) x)
-> (forall x. Rep (FeatureData d) x -> FeatureData d)
-> Generic (FeatureData d)
forall x. Rep (FeatureData d) x -> FeatureData d
forall x. FeatureData d -> Rep (FeatureData d) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall d x. Rep (FeatureData d) x -> FeatureData d
forall d x. FeatureData d -> Rep (FeatureData d) x
$cto :: forall d x. Rep (FeatureData d) x -> FeatureData d
$cfrom :: forall d x. FeatureData d -> Rep (FeatureData d) x
Generic)
featureDataR :: d -> FeatureData d
featureDataR :: d -> FeatureData d
featureDataR = Either MissingReason d -> FeatureData d
forall d. Either MissingReason d -> FeatureData d
MkFeatureData (Either MissingReason d -> FeatureData d)
-> (d -> Either MissingReason d) -> d -> FeatureData d
forall b c a. (b -> c) -> (a -> b) -> a -> c
. d -> Either MissingReason d
forall a b. b -> Either a b
Right
featureDataL :: MissingReason -> FeatureData d
featureDataL :: MissingReason -> FeatureData d
featureDataL = Either MissingReason d -> FeatureData d
forall d. Either MissingReason d -> FeatureData d
MkFeatureData (Either MissingReason d -> FeatureData d)
-> (MissingReason -> Either MissingReason d)
-> MissingReason
-> FeatureData d
forall b c a. (b -> c) -> (a -> b) -> a -> c
. MissingReason -> Either MissingReason d
forall a b. a -> Either a b
Left
missingBecause :: MissingReason -> FeatureData d
missingBecause :: MissingReason -> FeatureData d
missingBecause = MissingReason -> FeatureData d
forall d. MissingReason -> FeatureData d
featureDataL
instance Functor FeatureData where
fmap :: (a -> b) -> FeatureData a -> FeatureData b
fmap a -> b
f (MkFeatureData Either MissingReason a
x) = Either MissingReason b -> FeatureData b
forall d. Either MissingReason d -> FeatureData d
MkFeatureData ((a -> b) -> Either MissingReason a -> Either MissingReason b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> b
f Either MissingReason a
x)
instance Applicative FeatureData where
pure :: a -> FeatureData a
pure = a -> FeatureData a
forall a. a -> FeatureData a
featureDataR
liftA2 :: (a -> b -> c) -> FeatureData a -> FeatureData b -> FeatureData c
liftA2 a -> b -> c
f (MkFeatureData Either MissingReason a
x) (MkFeatureData Either MissingReason b
y) = Either MissingReason c -> FeatureData c
forall d. Either MissingReason d -> FeatureData d
MkFeatureData ((a -> b -> c)
-> Either MissingReason a
-> Either MissingReason b
-> Either MissingReason c
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 a -> b -> c
f Either MissingReason a
x Either MissingReason b
y)
instance Monad FeatureData where
(MkFeatureData Either MissingReason a
x) >>= :: FeatureData a -> (a -> FeatureData b) -> FeatureData b
>>= a -> FeatureData b
f = case (a -> FeatureData b)
-> Either MissingReason a -> Either MissingReason (FeatureData b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> FeatureData b
f Either MissingReason a
x of
Left MissingReason
l -> Either MissingReason b -> FeatureData b
forall d. Either MissingReason d -> FeatureData d
MkFeatureData (Either MissingReason b -> FeatureData b)
-> Either MissingReason b -> FeatureData b
forall a b. (a -> b) -> a -> b
$ MissingReason -> Either MissingReason b
forall a b. a -> Either a b
Left MissingReason
l
Right FeatureData b
v -> FeatureData b
v
instance Foldable FeatureData where
foldr :: (a -> b -> b) -> b -> FeatureData a -> b
foldr a -> b -> b
f b
x (MkFeatureData Either MissingReason a
z) = (a -> b -> b) -> b -> Either MissingReason a -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr a -> b -> b
f b
x Either MissingReason a
z
instance Traversable FeatureData where
traverse :: (a -> f b) -> FeatureData a -> f (FeatureData b)
traverse a -> f b
f (MkFeatureData Either MissingReason a
z) = Either MissingReason b -> FeatureData b
forall d. Either MissingReason d -> FeatureData d
MkFeatureData (Either MissingReason b -> FeatureData b)
-> f (Either MissingReason b) -> f (FeatureData b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (a -> f b) -> Either MissingReason a -> f (Either MissingReason b)
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse a -> f b
f Either MissingReason a
z
newtype (KnownSymbol name) => Feature name d =
MkFeature ( FeatureData d )
deriving (Feature name d -> Feature name d -> Bool
(Feature name d -> Feature name d -> Bool)
-> (Feature name d -> Feature name d -> Bool)
-> Eq (Feature name d)
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
forall (name :: Symbol) d.
Eq d =>
Feature name d -> Feature name d -> Bool
/= :: Feature name d -> Feature name d -> Bool
$c/= :: forall (name :: Symbol) d.
Eq d =>
Feature name d -> Feature name d -> Bool
== :: Feature name d -> Feature name d -> Bool
$c== :: forall (name :: Symbol) d.
Eq d =>
Feature name d -> Feature name d -> Bool
Eq)
getFData :: Feature name d -> FeatureData d
getFData :: Feature name d -> FeatureData d
getFData (MkFeature FeatureData d
d) = FeatureData d
d
makeFeature :: (KnownSymbol name) => FeatureData d -> Feature name d
makeFeature :: FeatureData d -> Feature name d
makeFeature = FeatureData d -> Feature name d
forall (name :: Symbol) d. FeatureData d -> Feature name d
MkFeature
getData :: Feature n d -> Either MissingReason d
getData :: Feature n d -> Either MissingReason d
getData (MkFeature FeatureData d
x) = FeatureData d -> Either MissingReason d
forall d. FeatureData d -> Either MissingReason d
getFeatureData FeatureData d
x
instance (KnownSymbol name, Show a) => Show (Feature name a) where
show :: Feature name a -> String
show (MkFeature FeatureData a
x) = ShowS
forall a. Show a => a -> String
show (Proxy name -> String
forall (n :: Symbol) (proxy :: Symbol -> *).
KnownSymbol n =>
proxy n -> String
symbolVal (Proxy name
forall k (t :: k). Proxy t
Proxy @name)) String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
": " String -> ShowS
forall a. [a] -> [a] -> [a]
++ FeatureData a -> String
forall a. Show a => a -> String
show FeatureData a
x
instance Functor (Feature name) where
fmap :: (a -> b) -> Feature name a -> Feature name b
fmap a -> b
f (MkFeature FeatureData a
x) = FeatureData b -> Feature name b
forall (name :: Symbol) d. FeatureData d -> Feature name d
MkFeature ((a -> b) -> FeatureData a -> FeatureData b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> b
f FeatureData a
x)
instance Applicative (Feature name) where
pure :: a -> Feature name a
pure a
x = FeatureData a -> Feature name a
forall (name :: Symbol) d. FeatureData d -> Feature name d
MkFeature (a -> FeatureData a
forall (f :: * -> *) a. Applicative f => a -> f a
pure a
x)
liftA2 :: (a -> b -> c) -> Feature name a -> Feature name b -> Feature name c
liftA2 a -> b -> c
f (MkFeature FeatureData a
x) (MkFeature FeatureData b
y) = FeatureData c -> Feature name c
forall (name :: Symbol) d. FeatureData d -> Feature name d
MkFeature ((a -> b -> c) -> FeatureData a -> FeatureData b -> FeatureData c
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 a -> b -> c
f FeatureData a
x FeatureData b
y)
instance Foldable (Feature name) where
foldr :: (a -> b -> b) -> b -> Feature name a -> b
foldr a -> b -> b
f b
x (MkFeature FeatureData a
t) = (a -> b -> b) -> b -> FeatureData a -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr a -> b -> b
f b
x FeatureData a
t
instance Traversable (Feature name) where
traverse :: (a -> f b) -> Feature name a -> f (Feature name b)
traverse a -> f b
f (MkFeature FeatureData a
x) = FeatureData b -> Feature name b
forall (name :: Symbol) d. FeatureData d -> Feature name d
MkFeature (FeatureData b -> Feature name b)
-> f (FeatureData b) -> f (Feature name b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (a -> f b) -> FeatureData a -> f (FeatureData b)
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse a -> f b
f FeatureData a
x
instance Monad (Feature name) where
(MkFeature FeatureData a
x) >>= :: Feature name a -> (a -> Feature name b) -> Feature name b
>>= a -> Feature name b
f = case (a -> Feature name b)
-> FeatureData a -> FeatureData (Feature name b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> Feature name b
f FeatureData a
x of
MkFeatureData (Left MissingReason
l) -> FeatureData b -> Feature name b
forall (name :: Symbol) d. FeatureData d -> Feature name d
MkFeature (FeatureData b -> Feature name b)
-> FeatureData b -> Feature name b
forall a b. (a -> b) -> a -> b
$ Either MissingReason b -> FeatureData b
forall d. Either MissingReason d -> FeatureData d
MkFeatureData (MissingReason -> Either MissingReason b
forall a b. a -> Either a b
Left MissingReason
l)
MkFeatureData (Right Feature name b
r) -> Feature name b
r
data FeatureN d = MkFeatureN
{ FeatureN d -> Text
getNameN :: Text
, FeatureN d -> FeatureData d
getDataN :: FeatureData d
}
deriving (FeatureN d -> FeatureN d -> Bool
(FeatureN d -> FeatureN d -> Bool)
-> (FeatureN d -> FeatureN d -> Bool) -> Eq (FeatureN d)
forall d. Eq d => FeatureN d -> FeatureN d -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: FeatureN d -> FeatureN d -> Bool
$c/= :: forall d. Eq d => FeatureN d -> FeatureN d -> Bool
== :: FeatureN d -> FeatureN d -> Bool
$c== :: forall d. Eq d => FeatureN d -> FeatureN d -> Bool
Eq, Int -> FeatureN d -> ShowS
[FeatureN d] -> ShowS
FeatureN d -> String
(Int -> FeatureN d -> ShowS)
-> (FeatureN d -> String)
-> ([FeatureN d] -> ShowS)
-> Show (FeatureN d)
forall d. Show d => Int -> FeatureN d -> ShowS
forall d. Show d => [FeatureN d] -> ShowS
forall d. Show d => FeatureN d -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [FeatureN d] -> ShowS
$cshowList :: forall d. Show d => [FeatureN d] -> ShowS
show :: FeatureN d -> String
$cshow :: forall d. Show d => FeatureN d -> String
showsPrec :: Int -> FeatureN d -> ShowS
$cshowsPrec :: forall d. Show d => Int -> FeatureN d -> ShowS
Show)
nameFeature
:: forall name d . (KnownSymbol name) => Feature name d -> FeatureN d
nameFeature :: Feature name d -> FeatureN d
nameFeature (MkFeature FeatureData d
d) = Text -> FeatureData d -> FeatureN d
forall d. Text -> FeatureData d -> FeatureN d
MkFeatureN (String -> Text
pack (String -> Text) -> String -> Text
forall a b. (a -> b) -> a -> b
$ Proxy name -> String
forall (n :: Symbol) (proxy :: Symbol -> *).
KnownSymbol n =>
proxy n -> String
symbolVal (Proxy name
forall k (t :: k). Proxy t
Proxy @name)) FeatureData d
d
data Definition d where
Pure :: a -> Definition (F n0 a )
D1 :: (b -> a) -> Definition (F n1 b -> F n0 a)
D1A :: (b -> F n0 a) -> Definition (F n1 b -> F n0 a)
D1C :: (a2 -> a1 -> a)
-> Definition (F n1 b -> F n02 a2)
-> Definition (F n1 b -> F n01 a1)
-> Definition (F n1 b -> F n0 a )
D2 :: (c -> b -> a) -> Definition (F n2 c -> F n1 b -> F n0 a)
D2A :: (c -> b -> F n0 a) -> Definition (F n2 c -> F n1 b -> F n0 a)
D2C :: (a2 -> a1 -> a)
-> Definition (F n2 c -> F n1 b -> F n02 a2)
-> Definition (F n2 c -> F n1 b -> F n01 a1)
-> Definition (F n2 c -> F n1 b -> F n0 a )
D3 :: (d -> c -> b -> a) -> Definition (F n3 d -> F n2 c -> F n1 b -> F n0 a)
D3A :: (d -> c -> b -> F n0 a) -> Definition (F n3 d -> F n2 c -> F n1 b -> F n0 a)
D3C :: (a2 -> a1 -> a)
-> Definition (F n3 d -> F n2 c -> F n1 b -> F n02 a2)
-> Definition (F n3 d -> F n2 c -> F n1 b -> F n01 a1)
-> Definition (F n3 d -> F n2 c -> F n1 b -> F n0 a )
D4 :: (e -> d -> c -> b -> a)
-> Definition (F n4 e -> F n3 d -> F n2 c -> F n1 b -> F n0 a)
D4A :: (e -> d -> c -> b -> F n0 a)
-> Definition (F n4 e -> F n3 d -> F n2 c -> F n1 b -> F n0 a)
D4C :: (a2 -> a1 -> a)
-> Definition (F n4 e -> F n3 d -> F n2 c -> F n1 b -> F n02 a2)
-> Definition (F n4 e -> F n3 d -> F n2 c -> F n1 b -> F n01 a1)
-> Definition (F n4 e -> F n3 d -> F n2 c -> F n1 b -> F n0 a )
class Define inputs def | def -> inputs where
define :: inputs -> Definition def
instance Define a (Feature n0 a) where
define :: a -> Definition (Feature n0 a)
define = a -> Definition (Feature n0 a)
forall a (n0 :: Symbol). a -> Definition (Feature n0 a)
Pure
instance Define (b -> a) (Feature n1 b -> Feature n0 a) where
define :: (b -> a) -> Definition (Feature n1 b -> Feature n0 a)
define = (b -> a) -> Definition (Feature n1 b -> Feature n0 a)
forall b a (n1 :: Symbol) (n0 :: Symbol).
(b -> a) -> Definition (Feature n1 b -> Feature n0 a)
D1
instance Define (c -> b -> a) (Feature n2 c -> Feature n1 b -> Feature n0 a) where
define :: (c -> b -> a)
-> Definition (Feature n2 c -> Feature n1 b -> Feature n0 a)
define = (c -> b -> a)
-> Definition (Feature n2 c -> Feature n1 b -> Feature n0 a)
forall c b a (n2 :: Symbol) (n1 :: Symbol) (n0 :: Symbol).
(c -> b -> a)
-> Definition (Feature n2 c -> Feature n1 b -> Feature n0 a)
D2
instance Define (d -> c -> b -> a) (Feature n3 d -> Feature n2 c -> Feature n1 b -> Feature n0 a) where
define :: (d -> c -> b -> a)
-> Definition
(Feature n3 d -> Feature n2 c -> Feature n1 b -> Feature n0 a)
define = (d -> c -> b -> a)
-> Definition
(Feature n3 d -> Feature n2 c -> Feature n1 b -> Feature n0 a)
forall d c b a (n3 :: Symbol) (n2 :: Symbol) (n1 :: Symbol)
(n0 :: Symbol).
(d -> c -> b -> a)
-> Definition
(Feature n3 d -> Feature n2 c -> Feature n1 b -> Feature n0 a)
D3
instance Define (e -> d -> c -> b -> a) (Feature n4 e -> Feature n3 d -> Feature n2 c -> Feature n1 b -> Feature n0 a) where
define :: (e -> d -> c -> b -> a)
-> Definition
(Feature n4 e
-> Feature n3 d -> Feature n2 c -> Feature n1 b -> Feature n0 a)
define = (e -> d -> c -> b -> a)
-> Definition
(Feature n4 e
-> Feature n3 d -> Feature n2 c -> Feature n1 b -> Feature n0 a)
forall e d c b a (n4 :: Symbol) (n3 :: Symbol) (n2 :: Symbol)
(n1 :: Symbol) (n0 :: Symbol).
(e -> d -> c -> b -> a)
-> Definition
(Feature n4 e
-> Feature n3 d -> Feature n2 c -> Feature n1 b -> Feature n0 a)
D4
class DefineA inputs def | def -> inputs where
defineA :: inputs -> Definition def
instance DefineA (b -> Feature n0 a) (Feature n1 b -> Feature n0 a) where
defineA :: (b -> Feature n0 a) -> Definition (Feature n1 b -> Feature n0 a)
defineA = (b -> Feature n0 a) -> Definition (Feature n1 b -> Feature n0 a)
forall b (n0 :: Symbol) a (n1 :: Symbol).
(b -> Feature n0 a) -> Definition (Feature n1 b -> Feature n0 a)
D1A
instance DefineA (c -> b -> Feature n0 a) (Feature n2 c -> Feature n1 b -> Feature n0 a) where
defineA :: (c -> b -> Feature n0 a)
-> Definition (Feature n2 c -> Feature n1 b -> Feature n0 a)
defineA = (c -> b -> Feature n0 a)
-> Definition (Feature n2 c -> Feature n1 b -> Feature n0 a)
forall c b (n0 :: Symbol) a (n2 :: Symbol) (n1 :: Symbol).
(c -> b -> Feature n0 a)
-> Definition (Feature n2 c -> Feature n1 b -> Feature n0 a)
D2A
instance DefineA (d -> c -> b -> Feature n0 a) (Feature n3 d -> Feature n2 c -> Feature n1 b -> Feature n0 a) where
defineA :: (d -> c -> b -> Feature n0 a)
-> Definition
(Feature n3 d -> Feature n2 c -> Feature n1 b -> Feature n0 a)
defineA = (d -> c -> b -> Feature n0 a)
-> Definition
(Feature n3 d -> Feature n2 c -> Feature n1 b -> Feature n0 a)
forall d c b (n0 :: Symbol) a (n3 :: Symbol) (n2 :: Symbol)
(n1 :: Symbol).
(d -> c -> b -> Feature n0 a)
-> Definition
(Feature n3 d -> Feature n2 c -> Feature n1 b -> Feature n0 a)
D3A
instance DefineA (e -> d -> c -> b -> Feature n0 a) (Feature n4 e -> Feature n3 d -> Feature n2 c -> Feature n1 b -> Feature n0 a) where
defineA :: (e -> d -> c -> b -> Feature n0 a)
-> Definition
(Feature n4 e
-> Feature n3 d -> Feature n2 c -> Feature n1 b -> Feature n0 a)
defineA = (e -> d -> c -> b -> Feature n0 a)
-> Definition
(Feature n4 e
-> Feature n3 d -> Feature n2 c -> Feature n1 b -> Feature n0 a)
forall e d c b (n0 :: Symbol) a (n4 :: Symbol) (n3 :: Symbol)
(n2 :: Symbol) (n1 :: Symbol).
(e -> d -> c -> b -> Feature n0 a)
-> Definition
(Feature n4 e
-> Feature n3 d -> Feature n2 c -> Feature n1 b -> Feature n0 a)
D4A
eval :: Definition d -> d
eval :: Definition d -> d
eval Definition d
d = case Definition d
d of
Pure a
x -> a -> Feature n0 a
forall (f :: * -> *) a. Applicative f => a -> f a
pure a
x
D1 b -> a
f -> \(MkFeature FeatureData b
x) -> FeatureData a -> Feature n0 a
forall (name :: Symbol) d. FeatureData d -> Feature name d
MkFeature (FeatureData a -> Feature n0 a) -> FeatureData a -> Feature n0 a
forall a b. (a -> b) -> a -> b
$ (b -> a) -> FeatureData b -> FeatureData a
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap b -> a
f FeatureData b
x
D1A b -> F n0 a
f -> \(MkFeature FeatureData b
x) ->
case (b -> F n0 a) -> FeatureData b -> FeatureData (F n0 a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap b -> F n0 a
f FeatureData b
x of
MkFeatureData (Left MissingReason
l) -> FeatureData a -> F n0 a
forall (name :: Symbol) d. FeatureData d -> Feature name d
MkFeature (FeatureData a -> F n0 a) -> FeatureData a -> F n0 a
forall a b. (a -> b) -> a -> b
$ Either MissingReason a -> FeatureData a
forall d. Either MissingReason d -> FeatureData d
MkFeatureData (MissingReason -> Either MissingReason a
forall a b. a -> Either a b
Left MissingReason
l)
MkFeatureData (Right F n0 a
r) -> F n0 a
r
D1C a2 -> a1 -> a
f Definition (F n1 b -> F n02 a2)
d1 Definition (F n1 b -> F n01 a1)
d2 -> \F n1 b
x -> FeatureData a -> Feature n0 a
forall (name :: Symbol) d. FeatureData d -> Feature name d
MkFeature (FeatureData a -> Feature n0 a) -> FeatureData a -> Feature n0 a
forall a b. (a -> b) -> a -> b
$ (a2 -> a1 -> a)
-> FeatureData a2 -> FeatureData a1 -> FeatureData a
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 a2 -> a1 -> a
f (F n02 a2 -> FeatureData a2
forall (name :: Symbol) d. Feature name d -> FeatureData d
getFData (Definition (F n1 b -> F n02 a2) -> F n1 b -> F n02 a2
forall d. Definition d -> d
eval Definition (F n1 b -> F n02 a2)
d1 F n1 b
x)) (F n01 a1 -> FeatureData a1
forall (name :: Symbol) d. Feature name d -> FeatureData d
getFData (Definition (F n1 b -> F n01 a1) -> F n1 b -> F n01 a1
forall d. Definition d -> d
eval Definition (F n1 b -> F n01 a1)
d2 F n1 b
x))
D2 c -> b -> a
f -> \(MkFeature FeatureData c
x) (MkFeature FeatureData b
y) -> FeatureData a -> Feature n0 a
forall (name :: Symbol) d. FeatureData d -> Feature name d
MkFeature (FeatureData a -> Feature n0 a) -> FeatureData a -> Feature n0 a
forall a b. (a -> b) -> a -> b
$ (c -> b -> a) -> FeatureData c -> FeatureData b -> FeatureData a
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 c -> b -> a
f FeatureData c
x FeatureData b
y
D2A c -> b -> F n0 a
f -> \(MkFeature FeatureData c
x) (MkFeature FeatureData b
y) ->
case (c -> b -> F n0 a)
-> FeatureData c -> FeatureData b -> FeatureData (F n0 a)
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 c -> b -> F n0 a
f FeatureData c
x FeatureData b
y of
MkFeatureData (Left MissingReason
l) -> FeatureData a -> F n0 a
forall (name :: Symbol) d. FeatureData d -> Feature name d
MkFeature (FeatureData a -> F n0 a) -> FeatureData a -> F n0 a
forall a b. (a -> b) -> a -> b
$ Either MissingReason a -> FeatureData a
forall d. Either MissingReason d -> FeatureData d
MkFeatureData (MissingReason -> Either MissingReason a
forall a b. a -> Either a b
Left MissingReason
l)
MkFeatureData (Right F n0 a
r) -> F n0 a
r
D2C a2 -> a1 -> a
f Definition (F n2 c -> F n1 b -> F n02 a2)
d1 Definition (F n2 c -> F n1 b -> F n01 a1)
d2 -> \F n2 c
x F n1 b
y -> FeatureData a -> Feature n0 a
forall (name :: Symbol) d. FeatureData d -> Feature name d
MkFeature (FeatureData a -> Feature n0 a) -> FeatureData a -> Feature n0 a
forall a b. (a -> b) -> a -> b
$ (a2 -> a1 -> a)
-> FeatureData a2 -> FeatureData a1 -> FeatureData a
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 a2 -> a1 -> a
f (F n02 a2 -> FeatureData a2
forall (name :: Symbol) d. Feature name d -> FeatureData d
getFData (Definition (F n2 c -> F n1 b -> F n02 a2)
-> F n2 c -> F n1 b -> F n02 a2
forall d. Definition d -> d
eval Definition (F n2 c -> F n1 b -> F n02 a2)
d1 F n2 c
x F n1 b
y)) (F n01 a1 -> FeatureData a1
forall (name :: Symbol) d. Feature name d -> FeatureData d
getFData (Definition (F n2 c -> F n1 b -> F n01 a1)
-> F n2 c -> F n1 b -> F n01 a1
forall d. Definition d -> d
eval Definition (F n2 c -> F n1 b -> F n01 a1)
d2 F n2 c
x F n1 b
y))
D3 d -> c -> b -> a
f -> \(MkFeature FeatureData d
x) (MkFeature FeatureData c
y) (MkFeature FeatureData b
z) ->
FeatureData a -> Feature n0 a
forall (name :: Symbol) d. FeatureData d -> Feature name d
MkFeature (FeatureData a -> Feature n0 a) -> FeatureData a -> Feature n0 a
forall a b. (a -> b) -> a -> b
$ (d -> c -> b -> a)
-> FeatureData d -> FeatureData c -> FeatureData b -> FeatureData a
forall (f :: * -> *) a b c d.
Applicative f =>
(a -> b -> c -> d) -> f a -> f b -> f c -> f d
liftA3 d -> c -> b -> a
f FeatureData d
x FeatureData c
y FeatureData b
z
D3A d -> c -> b -> F n0 a
f -> \(MkFeature FeatureData d
x) (MkFeature FeatureData c
y) (MkFeature FeatureData b
z) ->
case (d -> c -> b -> F n0 a)
-> FeatureData d
-> FeatureData c
-> FeatureData b
-> FeatureData (F n0 a)
forall (f :: * -> *) a b c d.
Applicative f =>
(a -> b -> c -> d) -> f a -> f b -> f c -> f d
liftA3 d -> c -> b -> F n0 a
f FeatureData d
x FeatureData c
y FeatureData b
z of
MkFeatureData (Left MissingReason
l) -> FeatureData a -> F n0 a
forall (name :: Symbol) d. FeatureData d -> Feature name d
MkFeature (FeatureData a -> F n0 a) -> FeatureData a -> F n0 a
forall a b. (a -> b) -> a -> b
$ Either MissingReason a -> FeatureData a
forall d. Either MissingReason d -> FeatureData d
MkFeatureData (MissingReason -> Either MissingReason a
forall a b. a -> Either a b
Left MissingReason
l)
MkFeatureData (Right F n0 a
r) -> F n0 a
r
D3C a2 -> a1 -> a
f Definition (F n3 d -> F n2 c -> F n1 b -> F n02 a2)
d1 Definition (F n3 d -> F n2 c -> F n1 b -> F n01 a1)
d2 -> \F n3 d
x F n2 c
y F n1 b
z -> FeatureData a -> Feature n0 a
forall (name :: Symbol) d. FeatureData d -> Feature name d
MkFeature (FeatureData a -> Feature n0 a) -> FeatureData a -> Feature n0 a
forall a b. (a -> b) -> a -> b
$ (a2 -> a1 -> a)
-> FeatureData a2 -> FeatureData a1 -> FeatureData a
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 a2 -> a1 -> a
f (F n02 a2 -> FeatureData a2
forall (name :: Symbol) d. Feature name d -> FeatureData d
getFData (F n02 a2 -> FeatureData a2) -> F n02 a2 -> FeatureData a2
forall a b. (a -> b) -> a -> b
$ Definition (F n3 d -> F n2 c -> F n1 b -> F n02 a2)
-> F n3 d -> F n2 c -> F n1 b -> F n02 a2
forall d. Definition d -> d
eval Definition (F n3 d -> F n2 c -> F n1 b -> F n02 a2)
d1 F n3 d
x F n2 c
y F n1 b
z) (F n01 a1 -> FeatureData a1
forall (name :: Symbol) d. Feature name d -> FeatureData d
getFData (F n01 a1 -> FeatureData a1) -> F n01 a1 -> FeatureData a1
forall a b. (a -> b) -> a -> b
$ Definition (F n3 d -> F n2 c -> F n1 b -> F n01 a1)
-> F n3 d -> F n2 c -> F n1 b -> F n01 a1
forall d. Definition d -> d
eval Definition (F n3 d -> F n2 c -> F n1 b -> F n01 a1)
d2 F n3 d
x F n2 c
y F n1 b
z)
D4 e -> d -> c -> b -> a
f -> \(MkFeature FeatureData e
v) (MkFeature FeatureData d
x) (MkFeature FeatureData c
y) (MkFeature FeatureData b
z) ->
FeatureData a -> Feature n0 a
forall (name :: Symbol) d. FeatureData d -> Feature name d
MkFeature (FeatureData a -> Feature n0 a) -> FeatureData a -> Feature n0 a
forall a b. (a -> b) -> a -> b
$ (e -> d -> c -> b -> a)
-> FeatureData e
-> FeatureData d
-> FeatureData c
-> FeatureData b
-> FeatureData a
forall (m :: * -> *) a1 a2 a3 a4 r.
Monad m =>
(a1 -> a2 -> a3 -> a4 -> r) -> m a1 -> m a2 -> m a3 -> m a4 -> m r
liftM4 e -> d -> c -> b -> a
f FeatureData e
v FeatureData d
x FeatureData c
y FeatureData b
z
D4A e -> d -> c -> b -> F n0 a
f -> \(MkFeature FeatureData e
v) (MkFeature FeatureData d
x) (MkFeature FeatureData c
y) (MkFeature FeatureData b
z) ->
case (e -> d -> c -> b -> F n0 a)
-> FeatureData e
-> FeatureData d
-> FeatureData c
-> FeatureData b
-> FeatureData (F n0 a)
forall (m :: * -> *) a1 a2 a3 a4 r.
Monad m =>
(a1 -> a2 -> a3 -> a4 -> r) -> m a1 -> m a2 -> m a3 -> m a4 -> m r
liftM4 e -> d -> c -> b -> F n0 a
f FeatureData e
v FeatureData d
x FeatureData c
y FeatureData b
z of
MkFeatureData (Left MissingReason
l) -> FeatureData a -> F n0 a
forall (name :: Symbol) d. FeatureData d -> Feature name d
MkFeature (FeatureData a -> F n0 a) -> FeatureData a -> F n0 a
forall a b. (a -> b) -> a -> b
$ Either MissingReason a -> FeatureData a
forall d. Either MissingReason d -> FeatureData d
MkFeatureData (MissingReason -> Either MissingReason a
forall a b. a -> Either a b
Left MissingReason
l)
MkFeatureData (Right F n0 a
r) -> F n0 a
r
D4C a2 -> a1 -> a
f Definition (F n4 e -> F n3 d -> F n2 c -> F n1 b -> F n02 a2)
d1 Definition (F n4 e -> F n3 d -> F n2 c -> F n1 b -> F n01 a1)
d2 -> \F n4 e
v F n3 d
x F n2 c
y F n1 b
z -> FeatureData a -> Feature n0 a
forall (name :: Symbol) d. FeatureData d -> Feature name d
MkFeature (FeatureData a -> Feature n0 a) -> FeatureData a -> Feature n0 a
forall a b. (a -> b) -> a -> b
$ (a2 -> a1 -> a)
-> FeatureData a2 -> FeatureData a1 -> FeatureData a
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 a2 -> a1 -> a
f (F n02 a2 -> FeatureData a2
forall (name :: Symbol) d. Feature name d -> FeatureData d
getFData (F n02 a2 -> FeatureData a2) -> F n02 a2 -> FeatureData a2
forall a b. (a -> b) -> a -> b
$ Definition (F n4 e -> F n3 d -> F n2 c -> F n1 b -> F n02 a2)
-> F n4 e -> F n3 d -> F n2 c -> F n1 b -> F n02 a2
forall d. Definition d -> d
eval Definition (F n4 e -> F n3 d -> F n2 c -> F n1 b -> F n02 a2)
d1 F n4 e
v F n3 d
x F n2 c
y F n1 b
z) (F n01 a1 -> FeatureData a1
forall (name :: Symbol) d. Feature name d -> FeatureData d
getFData (F n01 a1 -> FeatureData a1) -> F n01 a1 -> FeatureData a1
forall a b. (a -> b) -> a -> b
$ Definition (F n4 e -> F n3 d -> F n2 c -> F n1 b -> F n01 a1)
-> F n4 e -> F n3 d -> F n2 c -> F n1 b -> F n01 a1
forall d. Definition d -> d
eval Definition (F n4 e -> F n3 d -> F n2 c -> F n1 b -> F n01 a1)
d2 F n4 e
v F n3 d
x F n2 c
y F n1 b
z)