module CodeWorld.Test.Solution (
PicPredicate,
containsElem,
containsElems,
containsExactElems,
evaluatePred,
evaluatePreds,
hasRelation,
(<||>),
option,
options,
ifThen,
thisOften,
atLeast,
atMost,
inRangeOf,
findMaybe,
findAll,
findAllAnd,
findMaybeAnd,
findAllActual,
findMaybeActual,
findAllActualAnd,
findMaybeActualAnd,
oneOf,
getComponents,
) where
import Data.Maybe (listToMaybe)
import CodeWorld.Tasks.Picture (Picture, toInterface)
import CodeWorld.Test.Normalize (
NormalizedPicture(..),
contains,
count,
getSubPictures,
)
import CodeWorld.Test.Relative (
Components(..),
SpatialQuery,
toRelative,
)
type PicPredicate = Components -> Bool
options :: [PicPredicate] -> PicPredicate
options :: [PicPredicate] -> PicPredicate
options [PicPredicate]
ps Components
c = (PicPredicate -> Bool) -> [PicPredicate] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (\PicPredicate
p -> PicPredicate
p Components
c) [PicPredicate]
ps
(<||>) :: PicPredicate -> PicPredicate -> PicPredicate
<||> :: PicPredicate -> PicPredicate -> PicPredicate
(<||>) PicPredicate
p PicPredicate
q Components
c = PicPredicate
p Components
c Bool -> Bool -> Bool
|| PicPredicate
q Components
c
option :: PicPredicate -> PicPredicate -> PicPredicate
option :: PicPredicate -> PicPredicate -> PicPredicate
option = PicPredicate -> PicPredicate -> PicPredicate
(<||>)
oneOf :: (a -> PicPredicate) -> [a] -> PicPredicate
oneOf :: forall a. (a -> PicPredicate) -> [a] -> PicPredicate
oneOf a -> PicPredicate
p = (a -> PicPredicate -> PicPredicate)
-> PicPredicate -> [a] -> PicPredicate
forall a b. (a -> b -> b) -> b -> [a] -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (PicPredicate -> PicPredicate -> PicPredicate
(<||>) (PicPredicate -> PicPredicate -> PicPredicate)
-> (a -> PicPredicate) -> a -> PicPredicate -> PicPredicate
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> PicPredicate
p) (Bool -> PicPredicate
forall a b. a -> b -> a
const Bool
False)
specElems :: (NormalizedPicture -> Bool) -> PicPredicate
specElems :: (NormalizedPicture -> Bool) -> PicPredicate
specElems NormalizedPicture -> Bool
f (Components (NormalizedPicture
ps,[RelativePicSpec]
_)) = NormalizedPicture -> Bool
f NormalizedPicture
ps
findMaybe :: (NormalizedPicture -> Bool) -> Components -> Maybe NormalizedPicture
findMaybe :: (NormalizedPicture -> Bool)
-> Components -> Maybe NormalizedPicture
findMaybe NormalizedPicture -> Bool
f = [NormalizedPicture] -> Maybe NormalizedPicture
forall a. [a] -> Maybe a
listToMaybe ([NormalizedPicture] -> Maybe NormalizedPicture)
-> (Components -> [NormalizedPicture])
-> Components
-> Maybe NormalizedPicture
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (NormalizedPicture -> Bool) -> Components -> [NormalizedPicture]
findAll NormalizedPicture -> Bool
f
findAll :: (NormalizedPicture -> Bool) -> Components -> [NormalizedPicture]
findAll :: (NormalizedPicture -> Bool) -> Components -> [NormalizedPicture]
findAll NormalizedPicture -> Bool
f (Components (NormalizedPicture
ps,[RelativePicSpec]
_)) = (NormalizedPicture -> Bool)
-> [NormalizedPicture] -> [NormalizedPicture]
forall a. (a -> Bool) -> [a] -> [a]
filter NormalizedPicture -> Bool
f ([NormalizedPicture] -> [NormalizedPicture])
-> [NormalizedPicture] -> [NormalizedPicture]
forall a b. (a -> b) -> a -> b
$ NormalizedPicture -> [NormalizedPicture]
getSubPictures NormalizedPicture
ps
findAllActual :: (NormalizedPicture -> Bool) -> Picture -> [NormalizedPicture]
findAllActual :: (NormalizedPicture -> Bool) -> Picture -> [NormalizedPicture]
findAllActual NormalizedPicture -> Bool
f = (NormalizedPicture -> Bool)
-> [NormalizedPicture] -> [NormalizedPicture]
forall a. (a -> Bool) -> [a] -> [a]
filter NormalizedPicture -> Bool
f ([NormalizedPicture] -> [NormalizedPicture])
-> (Picture -> [NormalizedPicture])
-> Picture
-> [NormalizedPicture]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. NormalizedPicture -> [NormalizedPicture]
getSubPictures (NormalizedPicture -> [NormalizedPicture])
-> (Picture -> NormalizedPicture) -> Picture -> [NormalizedPicture]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Picture -> NormalizedPicture
forall a. Drawable a => Picture -> a
toInterface
findMaybeActual :: (NormalizedPicture -> Bool) -> Picture -> Maybe NormalizedPicture
findMaybeActual :: (NormalizedPicture -> Bool) -> Picture -> Maybe NormalizedPicture
findMaybeActual NormalizedPicture -> Bool
f = [NormalizedPicture] -> Maybe NormalizedPicture
forall a. [a] -> Maybe a
listToMaybe ([NormalizedPicture] -> Maybe NormalizedPicture)
-> (Picture -> [NormalizedPicture])
-> Picture
-> Maybe NormalizedPicture
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (NormalizedPicture -> Bool) -> Picture -> [NormalizedPicture]
findAllActual NormalizedPicture -> Bool
f
findAllActualAnd :: (NormalizedPicture -> Bool) -> (NormalizedPicture -> a) -> Picture -> [a]
findAllActualAnd :: forall a.
(NormalizedPicture -> Bool)
-> (NormalizedPicture -> a) -> Picture -> [a]
findAllActualAnd NormalizedPicture -> Bool
f NormalizedPicture -> a
g = (NormalizedPicture -> a) -> [NormalizedPicture] -> [a]
forall a b. (a -> b) -> [a] -> [b]
map NormalizedPicture -> a
g ([NormalizedPicture] -> [a])
-> (Picture -> [NormalizedPicture]) -> Picture -> [a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (NormalizedPicture -> Bool) -> Picture -> [NormalizedPicture]
findAllActual NormalizedPicture -> Bool
f
findMaybeActualAnd :: (NormalizedPicture -> Bool) -> (NormalizedPicture -> a) -> Picture -> Maybe a
findMaybeActualAnd :: forall a.
(NormalizedPicture -> Bool)
-> (NormalizedPicture -> a) -> Picture -> Maybe a
findMaybeActualAnd NormalizedPicture -> Bool
f NormalizedPicture -> a
g = [a] -> Maybe a
forall a. [a] -> Maybe a
listToMaybe ([a] -> Maybe a) -> (Picture -> [a]) -> Picture -> Maybe a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (NormalizedPicture -> Bool)
-> (NormalizedPicture -> a) -> Picture -> [a]
forall a.
(NormalizedPicture -> Bool)
-> (NormalizedPicture -> a) -> Picture -> [a]
findAllActualAnd NormalizedPicture -> Bool
f NormalizedPicture -> a
g
findAllAnd :: (NormalizedPicture -> Bool) -> (NormalizedPicture -> a) -> Components -> [a]
findAllAnd :: forall a.
(NormalizedPicture -> Bool)
-> (NormalizedPicture -> a) -> Components -> [a]
findAllAnd NormalizedPicture -> Bool
f NormalizedPicture -> a
g = (NormalizedPicture -> a) -> [NormalizedPicture] -> [a]
forall a b. (a -> b) -> [a] -> [b]
map NormalizedPicture -> a
g ([NormalizedPicture] -> [a])
-> (Components -> [NormalizedPicture]) -> Components -> [a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (NormalizedPicture -> Bool) -> Components -> [NormalizedPicture]
findAll NormalizedPicture -> Bool
f
findMaybeAnd :: (NormalizedPicture -> Bool) -> (NormalizedPicture -> a) -> Components -> Maybe a
findMaybeAnd :: forall a.
(NormalizedPicture -> Bool)
-> (NormalizedPicture -> a) -> Components -> Maybe a
findMaybeAnd NormalizedPicture -> Bool
f NormalizedPicture -> a
g = [a] -> Maybe a
forall a. [a] -> Maybe a
listToMaybe ([a] -> Maybe a) -> (Components -> [a]) -> Components -> Maybe a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (NormalizedPicture -> Bool)
-> (NormalizedPicture -> a) -> Components -> [a]
forall a.
(NormalizedPicture -> Bool)
-> (NormalizedPicture -> a) -> Components -> [a]
findAllAnd NormalizedPicture -> Bool
f NormalizedPicture -> a
g
containsExactElems :: [NormalizedPicture] -> PicPredicate
containsExactElems :: [NormalizedPicture] -> PicPredicate
containsExactElems [NormalizedPicture]
ps = (NormalizedPicture -> Bool) -> PicPredicate
specElems ((NormalizedPicture -> Bool) -> [NormalizedPicture] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all (\NormalizedPicture
tp -> [NormalizedPicture] -> NormalizedPicture
Pictures [NormalizedPicture]
ps NormalizedPicture -> NormalizedPicture -> Bool
`contains` NormalizedPicture
tp) ([NormalizedPicture] -> Bool)
-> (NormalizedPicture -> [NormalizedPicture])
-> NormalizedPicture
-> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. NormalizedPicture -> [NormalizedPicture]
getSubPictures)
containsElem :: NormalizedPicture -> PicPredicate
containsElem :: NormalizedPicture -> PicPredicate
containsElem NormalizedPicture
p = (NormalizedPicture -> Bool) -> PicPredicate
specElems (NormalizedPicture -> NormalizedPicture -> Bool
`contains` NormalizedPicture
p)
containsElems :: [NormalizedPicture] -> PicPredicate
containsElems :: [NormalizedPicture] -> PicPredicate
containsElems [NormalizedPicture]
ps = (NormalizedPicture -> Bool) -> PicPredicate
specElems (\NormalizedPicture
t -> (NormalizedPicture -> Bool) -> [NormalizedPicture] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all (\NormalizedPicture
p -> NormalizedPicture
t NormalizedPicture -> NormalizedPicture -> Bool
`contains` NormalizedPicture
p) [NormalizedPicture]
ps)
thisOften :: NormalizedPicture -> Int -> PicPredicate
thisOften :: NormalizedPicture -> Int -> PicPredicate
thisOften NormalizedPicture
p Int
amount = (NormalizedPicture -> Bool) -> PicPredicate
specElems (\NormalizedPicture
ps -> NormalizedPicture -> NormalizedPicture -> Int
count NormalizedPicture
p NormalizedPicture
ps Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
amount)
atLeast :: NormalizedPicture -> Int -> PicPredicate
atLeast :: NormalizedPicture -> Int -> PicPredicate
atLeast NormalizedPicture
p Int
amount = (NormalizedPicture -> Bool) -> PicPredicate
specElems (\NormalizedPicture
ps -> NormalizedPicture -> NormalizedPicture -> Int
count NormalizedPicture
p NormalizedPicture
ps Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= Int
amount)
atMost :: NormalizedPicture -> Int -> PicPredicate
atMost :: NormalizedPicture -> Int -> PicPredicate
atMost NormalizedPicture
p Int
amount = (NormalizedPicture -> Bool) -> PicPredicate
specElems (\NormalizedPicture
ps -> NormalizedPicture -> NormalizedPicture -> Int
count NormalizedPicture
p NormalizedPicture
ps Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
amount)
inRangeOf :: NormalizedPicture -> (Int,Int) -> PicPredicate
inRangeOf :: NormalizedPicture -> (Int, Int) -> PicPredicate
inRangeOf NormalizedPicture
p (Int
lower,Int
upper) = (NormalizedPicture -> Bool) -> PicPredicate
specElems (\NormalizedPicture
ps -> let occurs :: Int
occurs = NormalizedPicture -> NormalizedPicture -> Int
count NormalizedPicture
p NormalizedPicture
ps in Int
occurs Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= Int
lower Bool -> Bool -> Bool
&& Int
occurs Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
upper)
ifThen :: PicPredicate -> PicPredicate -> PicPredicate
ifThen :: PicPredicate -> PicPredicate -> PicPredicate
ifThen PicPredicate
f PicPredicate
g Components
comp = Bool -> Bool
not (PicPredicate
f Components
comp) Bool -> Bool -> Bool
|| PicPredicate
g Components
comp
specPosition :: SpatialQuery -> PicPredicate
specPosition :: SpatialQuery -> PicPredicate
specPosition SpatialQuery
f (Components (NormalizedPicture
_,[RelativePicSpec]
rP)) = SpatialQuery
f [RelativePicSpec]
rP
evaluatePreds :: [PicPredicate] -> Picture -> Bool
evaluatePreds :: [PicPredicate] -> Picture -> Bool
evaluatePreds [PicPredicate]
fs Picture
pic = (PicPredicate -> Bool) -> [PicPredicate] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all (PicPredicate -> Picture -> Bool
`evaluatePred` Picture
pic) [PicPredicate]
fs
evaluatePred :: PicPredicate -> Picture -> Bool
evaluatePred :: PicPredicate -> Picture -> Bool
evaluatePred PicPredicate
f = PicPredicate
f PicPredicate -> (Picture -> Components) -> Picture -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Picture -> Components
getComponents
getComponents :: Picture -> Components
getComponents :: Picture -> Components
getComponents = NormalizedPicture -> Components
toRelative (NormalizedPicture -> Components)
-> (Picture -> NormalizedPicture) -> Picture -> Components
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Picture -> NormalizedPicture
forall a. Drawable a => Picture -> a
toInterface
hasRelation :: SpatialQuery -> PicPredicate
hasRelation :: SpatialQuery -> PicPredicate
hasRelation = SpatialQuery -> PicPredicate
specPosition