{-# LANGUAGE OverloadedStrings #-}
module SvgIcons.Core.Utils
( evenOddSplit
, addXmlns
, (.:)
, distance
, horizontalMirrorMatrix
, verticalMirrorMatrix
, frame
, rectangleWithRoundCorners
) where
import Data.Char
import Text.Blaze.Svg11 ((!))
import Text.Blaze.Svg11 as S
import Text.Blaze.Svg11.Attributes as A
evenOddSplit :: [a] -> ([a], [a])
evenOddSplit :: forall a. [a] -> ([a], [a])
evenOddSplit [] = ([], [])
evenOddSplit (a
x:[a]
xs) = (a
xa -> [a] -> [a]
forall a. a -> [a] -> [a]
:[a]
o, [a]
e)
where ([a]
e,[a]
o) = [a] -> ([a], [a])
forall a. [a] -> ([a], [a])
evenOddSplit [a]
xs
addXmlns :: Svg -> Svg
addXmlns :: Svg -> Svg
addXmlns Svg
svg =
Svg
svg
Svg -> Attribute -> Svg
forall h. Attributable h => h -> Attribute -> h
! Tag -> AttributeValue -> Attribute
customAttribute Tag
"xmlns" AttributeValue
"http://www.w3.org/2000/svg"
Svg -> Attribute -> Svg
forall h. Attributable h => h -> Attribute -> h
! Tag -> AttributeValue -> Attribute
customAttribute Tag
"xmlns:xlink" AttributeValue
"http://www.w3.org/1999/xlink"
infixl 5 .:
(.:) :: (AttributeValue -> Attribute ) -> Float -> Attribute
AttributeValue -> Attribute
f .: :: (AttributeValue -> Attribute) -> Float -> Attribute
.: Float
x = AttributeValue -> Attribute
f (AttributeValue -> Attribute) -> AttributeValue -> Attribute
forall a b. (a -> b) -> a -> b
$ Float -> AttributeValue
forall a. ToValue a => a -> AttributeValue
S.toValue Float
x
distance :: (Float, Float) -> (Float, Float) -> Float
distance :: (Float, Float) -> (Float, Float) -> Float
distance (Float
ax,Float
ay) (Float
bx,Float
by) =
Float -> Float
forall a. Floating a => a -> a
sqrt (Float -> Float) -> Float -> Float
forall a b. (a -> b) -> a -> b
$ (Float
bx Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
ax)Float -> Float -> Float
forall a. Floating a => a -> a -> a
**Float
2 Float -> Float -> Float
forall a. Num a => a -> a -> a
+ (Float
by Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
ay)Float -> Float -> Float
forall a. Floating a => a -> a -> a
**Float
2
horizontalMirrorMatrix :: AttributeValue
horizontalMirrorMatrix :: AttributeValue
horizontalMirrorMatrix =
Integer
-> Integer
-> Integer
-> Integer
-> Integer
-> Integer
-> AttributeValue
forall a. Show a => a -> a -> a -> a -> a -> a -> AttributeValue
matrix (-Integer
1) Integer
0 Integer
0 Integer
1 Integer
0 Integer
0
verticalMirrorMatrix :: AttributeValue
verticalMirrorMatrix :: AttributeValue
verticalMirrorMatrix =
Integer
-> Integer
-> Integer
-> Integer
-> Integer
-> Integer
-> AttributeValue
forall a. Show a => a -> a -> a -> a -> a -> a -> AttributeValue
matrix Integer
1 Integer
0 Integer
0 (-Integer
1) Integer
0 Integer
0
frame
:: Float
-> String
-> Float
-> Float
-> Float
-> Float
-> S.Svg
frame :: Float -> String -> Float -> Float -> Float -> Float -> Svg
frame Float
s String
color Float
x Float
y Float
w Float
h =
Svg
S.path
Svg -> Attribute -> Svg
forall h. Attributable h => h -> Attribute -> h
! AttributeValue -> Attribute
A.class_ AttributeValue
"HaskellSvgIcons__frame"
Svg -> Attribute -> Svg
forall h. Attributable h => h -> Attribute -> h
! AttributeValue -> Attribute
A.fill AttributeValue
"none"
Svg -> Attribute -> Svg
forall h. Attributable h => h -> Attribute -> h
! AttributeValue -> Attribute
A.stroke (String -> AttributeValue
forall a. ToValue a => a -> AttributeValue
S.toValue String
color)
Svg -> Attribute -> Svg
forall h. Attributable h => h -> Attribute -> h
! (AttributeValue -> Attribute
A.strokeWidth (AttributeValue -> Attribute) -> Float -> Attribute
.: Float
s)
Svg -> Attribute -> Svg
forall h. Attributable h => h -> Attribute -> h
! AttributeValue -> Attribute
A.d AttributeValue
frameDirs
where
frameDirs :: AttributeValue
frameDirs = Path -> AttributeValue
mkPath (Path -> AttributeValue) -> Path -> AttributeValue
forall a b. (a -> b) -> a -> b
$ do
Float -> Float -> Path
forall a. Show a => a -> a -> Path
m Float
x Float
y
Float -> Float -> Path
forall a. Show a => a -> a -> Path
l Float
x (Float
y Float -> Float -> Float
forall a. Num a => a -> a -> a
+ Float
h)
Float -> Float -> Path
forall a. Show a => a -> a -> Path
l (Float
x Float -> Float -> Float
forall a. Num a => a -> a -> a
+ Float
w) (Float
y Float -> Float -> Float
forall a. Num a => a -> a -> a
+ Float
h)
Float -> Float -> Path
forall a. Show a => a -> a -> Path
l (Float
x Float -> Float -> Float
forall a. Num a => a -> a -> a
+ Float
w) Float
y
Path
S.z
Float -> Float -> Path
forall a. Show a => a -> a -> Path
m (Float
x Float -> Float -> Float
forall a. Num a => a -> a -> a
+ Float
wFloat -> Float -> Float
forall a. Fractional a => a -> a -> a
/Float
2) Float
y
Float -> Float -> Path
forall a. Show a => a -> a -> Path
l (Float
x Float -> Float -> Float
forall a. Num a => a -> a -> a
+ Float
wFloat -> Float -> Float
forall a. Fractional a => a -> a -> a
/Float
2) (Float
y Float -> Float -> Float
forall a. Num a => a -> a -> a
+ Float
h)
Float -> Float -> Path
forall a. Show a => a -> a -> Path
m Float
x (Float
y Float -> Float -> Float
forall a. Num a => a -> a -> a
+ Float
hFloat -> Float -> Float
forall a. Fractional a => a -> a -> a
/Float
2)
Float -> Float -> Path
forall a. Show a => a -> a -> Path
l (Float
x Float -> Float -> Float
forall a. Num a => a -> a -> a
+ Float
w) (Float
y Float -> Float -> Float
forall a. Num a => a -> a -> a
+ Float
hFloat -> Float -> Float
forall a. Fractional a => a -> a -> a
/Float
2)
rectangleWithRoundCorners
:: Float
-> (Float, Float)
-> (Float, Float)
-> S.Path
rectangleWithRoundCorners :: Float -> (Float, Float) -> (Float, Float) -> Path
rectangleWithRoundCorners Float
r0 (Float
w0,Float
h0) (Float
px,Float
py) =
let
x1 :: Float
x1 = Float
px Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
w0
x2 :: Float
x2 = Float
px Float -> Float -> Float
forall a. Num a => a -> a -> a
+ Float
w0
y1 :: Float
y1 = Float
py Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
h0
y2 :: Float
y2 = Float
py Float -> Float -> Float
forall a. Num a => a -> a -> a
+ Float
h0
in
do
Float -> Float -> Path
forall a. Show a => a -> a -> Path
m (Float
x1 Float -> Float -> Float
forall a. Num a => a -> a -> a
+ Float
r0) (Float
y1 )
Float -> Float -> Float -> Bool -> Bool -> Float -> Float -> Path
forall a. Show a => a -> a -> a -> Bool -> Bool -> a -> a -> Path
aa Float
r0 Float
r0 Float
0 Bool
False Bool
False (Float
x1 ) (Float
y1 Float -> Float -> Float
forall a. Num a => a -> a -> a
+ Float
r0)
Float -> Float -> Path
forall a. Show a => a -> a -> Path
l (Float
x1 ) (Float
y2 Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
r0)
Float -> Float -> Float -> Bool -> Bool -> Float -> Float -> Path
forall a. Show a => a -> a -> a -> Bool -> Bool -> a -> a -> Path
aa Float
r0 Float
r0 Float
0 Bool
False Bool
False (Float
x1 Float -> Float -> Float
forall a. Num a => a -> a -> a
+ Float
r0) (Float
y2 )
Float -> Float -> Path
forall a. Show a => a -> a -> Path
l (Float
x2 Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
r0) (Float
y2 )
Float -> Float -> Float -> Bool -> Bool -> Float -> Float -> Path
forall a. Show a => a -> a -> a -> Bool -> Bool -> a -> a -> Path
aa Float
r0 Float
r0 Float
0 Bool
False Bool
False (Float
x2 ) (Float
y2 Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
r0)
Float -> Float -> Path
forall a. Show a => a -> a -> Path
l (Float
x2 ) (Float
y1 Float -> Float -> Float
forall a. Num a => a -> a -> a
+ Float
r0)
Float -> Float -> Float -> Bool -> Bool -> Float -> Float -> Path
forall a. Show a => a -> a -> a -> Bool -> Bool -> a -> a -> Path
aa Float
r0 Float
r0 Float
0 Bool
False Bool
False (Float
x2 Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
r0) (Float
y1 )
Path
S.z