module CodeWorld.Test.AbstractHelpers where
import Data.Tuple.Extra (both)
import CodeWorld.Tasks.Picture
import CodeWorld.Tasks.Color (Color(..))
import CodeWorld.Test.Abstract (AbstractPicture, toConcretePicture)
import CodeWorld.Test.Rewrite (normalizeAndAbstract)
someSquare :: AbstractPicture
someSquare :: AbstractPicture
someSquare = Picture -> AbstractPicture
normalizeAndAbstract (Picture -> AbstractPicture) -> Picture -> AbstractPicture
forall a b. (a -> b) -> a -> b
$ Double -> Double -> Picture
rectangle Double
1 Double
1
someSolidSquare :: AbstractPicture
someSolidSquare :: AbstractPicture
someSolidSquare = Picture -> AbstractPicture
normalizeAndAbstract (Picture -> AbstractPicture) -> Picture -> AbstractPicture
forall a b. (a -> b) -> a -> b
$ Double -> Double -> Picture
solidRectangle Double
1 Double
1
someRectangle :: AbstractPicture
someRectangle :: AbstractPicture
someRectangle = AbstractPicture
someSquare
someSolidRectangle :: AbstractPicture
someSolidRectangle :: AbstractPicture
someSolidRectangle = AbstractPicture
someSolidSquare
someWideRectangle :: AbstractPicture
someWideRectangle :: AbstractPicture
someWideRectangle = Picture -> AbstractPicture
normalizeAndAbstract (Picture -> AbstractPicture) -> Picture -> AbstractPicture
forall a b. (a -> b) -> a -> b
$ Double -> Double -> Picture
rectangle Double
2 Double
1
someWideSolidRectangle :: AbstractPicture
someWideSolidRectangle :: AbstractPicture
someWideSolidRectangle = Picture -> AbstractPicture
normalizeAndAbstract (Picture -> AbstractPicture) -> Picture -> AbstractPicture
forall a b. (a -> b) -> a -> b
$ Double -> Double -> Picture
solidRectangle Double
2 Double
1
someTallRectangle :: AbstractPicture
someTallRectangle :: AbstractPicture
someTallRectangle = Picture -> AbstractPicture
normalizeAndAbstract (Picture -> AbstractPicture) -> Picture -> AbstractPicture
forall a b. (a -> b) -> a -> b
$ Double -> Double -> Picture
rectangle Double
1 Double
2
someTallSolidRectangle :: AbstractPicture
someTallSolidRectangle :: AbstractPicture
someTallSolidRectangle = Picture -> AbstractPicture
normalizeAndAbstract (Picture -> AbstractPicture) -> Picture -> AbstractPicture
forall a b. (a -> b) -> a -> b
$ Double -> Double -> Picture
solidRectangle Double
1 Double
2
someCircle :: AbstractPicture
someCircle :: AbstractPicture
someCircle = Picture -> AbstractPicture
normalizeAndAbstract (Picture -> AbstractPicture) -> Picture -> AbstractPicture
forall a b. (a -> b) -> a -> b
$ Double -> Picture
circle Double
1
someSolidCircle :: AbstractPicture
someSolidCircle :: AbstractPicture
someSolidCircle = Picture -> AbstractPicture
normalizeAndAbstract (Picture -> AbstractPicture) -> Picture -> AbstractPicture
forall a b. (a -> b) -> a -> b
$ Double -> Picture
solidCircle Double
1
someColor :: AbstractPicture -> AbstractPicture
someColor :: AbstractPicture -> AbstractPicture
someColor = (Picture -> Picture) -> AbstractPicture -> AbstractPicture
reNormalize ((Picture -> Picture) -> AbstractPicture -> AbstractPicture)
-> (Picture -> Picture) -> AbstractPicture -> AbstractPicture
forall a b. (a -> b) -> a -> b
$ Color -> Picture -> Picture
colored Color
AnyColor
withColor :: Color -> AbstractPicture -> AbstractPicture
withColor :: Color -> AbstractPicture -> AbstractPicture
withColor Color
color = (Picture -> Picture) -> AbstractPicture -> AbstractPicture
reNormalize ((Picture -> Picture) -> AbstractPicture -> AbstractPicture)
-> (Picture -> Picture) -> AbstractPicture -> AbstractPicture
forall a b. (a -> b) -> a -> b
$ Color -> Picture -> Picture
colored Color
color
rotatedQuarter :: AbstractPicture -> AbstractPicture
rotatedQuarter :: AbstractPicture -> AbstractPicture
rotatedQuarter = (Picture -> Picture) -> AbstractPicture -> AbstractPicture
reNormalize ((Picture -> Picture) -> AbstractPicture -> AbstractPicture)
-> (Picture -> Picture) -> AbstractPicture -> AbstractPicture
forall a b. (a -> b) -> a -> b
$ Double -> Picture -> Picture
rotated (Double -> Picture -> Picture) -> Double -> Picture -> Picture
forall a b. (a -> b) -> a -> b
$ Double
forall a. Floating a => a
piDouble -> Double -> Double
forall a. Fractional a => a -> a -> a
/Double
4
rotatedHalf :: AbstractPicture -> AbstractPicture
rotatedHalf :: AbstractPicture -> AbstractPicture
rotatedHalf = (Picture -> Picture) -> AbstractPicture -> AbstractPicture
reNormalize ((Picture -> Picture) -> AbstractPicture -> AbstractPicture)
-> (Picture -> Picture) -> AbstractPicture -> AbstractPicture
forall a b. (a -> b) -> a -> b
$ Double -> Picture -> Picture
rotated (Double -> Picture -> Picture) -> Double -> Picture -> Picture
forall a b. (a -> b) -> a -> b
$ Double
3Double -> Double -> Double
forall a. Num a => a -> a -> a
*Double
forall a. Floating a => a
piDouble -> Double -> Double
forall a. Fractional a => a -> a -> a
/Double
4
rotatedThreeQuarters :: AbstractPicture -> AbstractPicture
rotatedThreeQuarters :: AbstractPicture -> AbstractPicture
rotatedThreeQuarters = (Picture -> Picture) -> AbstractPicture -> AbstractPicture
reNormalize ((Picture -> Picture) -> AbstractPicture -> AbstractPicture)
-> (Picture -> Picture) -> AbstractPicture -> AbstractPicture
forall a b. (a -> b) -> a -> b
$ Double -> Picture -> Picture
rotated (Double -> Picture -> Picture) -> Double -> Picture -> Picture
forall a b. (a -> b) -> a -> b
$ Double
5Double -> Double -> Double
forall a. Num a => a -> a -> a
*Double
forall a. Floating a => a
piDouble -> Double -> Double
forall a. Fractional a => a -> a -> a
/Double
4
rotatedUpToFull :: AbstractPicture -> AbstractPicture
rotatedUpToFull :: AbstractPicture -> AbstractPicture
rotatedUpToFull = (Picture -> Picture) -> AbstractPicture -> AbstractPicture
reNormalize ((Picture -> Picture) -> AbstractPicture -> AbstractPicture)
-> (Picture -> Picture) -> AbstractPicture -> AbstractPicture
forall a b. (a -> b) -> a -> b
$ Double -> Picture -> Picture
rotated (Double -> Picture -> Picture) -> Double -> Picture -> Picture
forall a b. (a -> b) -> a -> b
$ Double
7Double -> Double -> Double
forall a. Num a => a -> a -> a
*Double
forall a. Floating a => a
piDouble -> Double -> Double
forall a. Fractional a => a -> a -> a
/Double
4
smaller :: AbstractPicture -> AbstractPicture
smaller :: AbstractPicture -> AbstractPicture
smaller = (Picture -> Picture) -> AbstractPicture -> AbstractPicture
reNormalize ((Picture -> Picture) -> AbstractPicture -> AbstractPicture)
-> (Picture -> Picture) -> AbstractPicture -> AbstractPicture
forall a b. (a -> b) -> a -> b
$ Double -> Picture -> Picture
dilated Double
0.5
larger :: AbstractPicture -> AbstractPicture
larger :: AbstractPicture -> AbstractPicture
larger = (Picture -> Picture) -> AbstractPicture -> AbstractPicture
reNormalize ((Picture -> Picture) -> AbstractPicture -> AbstractPicture)
-> (Picture -> Picture) -> AbstractPicture -> AbstractPicture
forall a b. (a -> b) -> a -> b
$ Double -> Picture -> Picture
dilated Double
2
smallerX :: AbstractPicture -> AbstractPicture
smallerX :: AbstractPicture -> AbstractPicture
smallerX = (Picture -> Picture) -> AbstractPicture -> AbstractPicture
reNormalize ((Picture -> Picture) -> AbstractPicture -> AbstractPicture)
-> (Picture -> Picture) -> AbstractPicture -> AbstractPicture
forall a b. (a -> b) -> a -> b
$ Double -> Double -> Picture -> Picture
scaled Double
0.5 Double
1
largerX :: AbstractPicture -> AbstractPicture
largerX :: AbstractPicture -> AbstractPicture
largerX = (Picture -> Picture) -> AbstractPicture -> AbstractPicture
reNormalize ((Picture -> Picture) -> AbstractPicture -> AbstractPicture)
-> (Picture -> Picture) -> AbstractPicture -> AbstractPicture
forall a b. (a -> b) -> a -> b
$ Double -> Double -> Picture -> Picture
scaled Double
2 Double
1
smallerY :: AbstractPicture -> AbstractPicture
smallerY :: AbstractPicture -> AbstractPicture
smallerY = (Picture -> Picture) -> AbstractPicture -> AbstractPicture
reNormalize ((Picture -> Picture) -> AbstractPicture -> AbstractPicture)
-> (Picture -> Picture) -> AbstractPicture -> AbstractPicture
forall a b. (a -> b) -> a -> b
$ Double -> Double -> Picture -> Picture
scaled Double
1 Double
0.5
largerY :: AbstractPicture -> AbstractPicture
largerY :: AbstractPicture -> AbstractPicture
largerY = (Picture -> Picture) -> AbstractPicture -> AbstractPicture
reNormalize ((Picture -> Picture) -> AbstractPicture -> AbstractPicture)
-> (Picture -> Picture) -> AbstractPicture -> AbstractPicture
forall a b. (a -> b) -> a -> b
$ Double -> Double -> Picture -> Picture
scaled Double
1 Double
2
someCurve :: Int -> AbstractPicture
someCurve :: Int -> AbstractPicture
someCurve Int
points = Picture -> AbstractPicture
normalizeAndAbstract (Picture -> AbstractPicture) -> Picture -> AbstractPicture
forall a b. (a -> b) -> a -> b
$
[Point] -> Picture
curve ([Point] -> Picture) -> [Point] -> Picture
forall a b. (a -> b) -> a -> b
$ Int -> [Point] -> [Point]
forall a. Int -> [a] -> [a]
take (Int
pointsInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
1) ([Point] -> [Point]) -> [Point] -> [Point]
forall a b. (a -> b) -> a -> b
$ (Point -> Point) -> Point -> [Point]
forall a. (a -> a) -> a -> [a]
iterate ((Double -> Double) -> Point -> Point
forall a b. (a -> b) -> (a, a) -> (b, b)
both (Double -> Double -> Double
forall a. Num a => a -> a -> a
+Double
0.1)) (Double
1,Double
0)
someSolidCurve :: Int -> AbstractPicture
someSolidCurve :: Int -> AbstractPicture
someSolidCurve Int
points = Picture -> AbstractPicture
normalizeAndAbstract (Picture -> AbstractPicture) -> Picture -> AbstractPicture
forall a b. (a -> b) -> a -> b
$
[Point] -> Picture
solidClosedCurve ([Point] -> Picture) -> [Point] -> Picture
forall a b. (a -> b) -> a -> b
$ Int -> [Point] -> [Point]
forall a. Int -> [a] -> [a]
take (Int
pointsInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
1) ([Point] -> [Point]) -> [Point] -> [Point]
forall a b. (a -> b) -> a -> b
$ (Point -> Point) -> Point -> [Point]
forall a. (a -> a) -> a -> [a]
iterate ((Double -> Double) -> Point -> Point
forall a b. (a -> b) -> (a, a) -> (b, b)
both (Double -> Double -> Double
forall a. Num a => a -> a -> a
+Double
0.1)) (Double
1,Double
0)
(.&.) :: AbstractPicture -> AbstractPicture -> AbstractPicture
AbstractPicture
p .&. :: AbstractPicture -> AbstractPicture -> AbstractPicture
.&. AbstractPicture
q = Picture -> AbstractPicture
normalizeAndAbstract (Picture -> AbstractPicture) -> Picture -> AbstractPicture
forall a b. (a -> b) -> a -> b
$ AbstractPicture -> Picture
toConcretePicture AbstractPicture
p Picture -> Picture -> Picture
& AbstractPicture -> Picture
toConcretePicture AbstractPicture
q
reNormalize :: (Picture -> Picture) -> (AbstractPicture -> AbstractPicture)
reNormalize :: (Picture -> Picture) -> AbstractPicture -> AbstractPicture
reNormalize Picture -> Picture
f = Picture -> AbstractPicture
normalizeAndAbstract (Picture -> AbstractPicture)
-> (AbstractPicture -> Picture)
-> AbstractPicture
-> AbstractPicture
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Picture -> Picture
f (Picture -> Picture)
-> (AbstractPicture -> Picture) -> AbstractPicture -> Picture
forall b c a. (b -> c) -> (a -> b) -> a -> c
. AbstractPicture -> Picture
toConcretePicture