module Device.Nintendo.Switch.Utils where
import Data.Attoparsec.ByteString (Parser, anyWord8)
import Data.Bits ((.|.), (.&.), Bits, shiftL)
import Data.Word (Word8)
checkMask :: (Bits a, Eq a) => a -> a -> Bool
checkMask :: a -> a -> Bool
checkMask a
mask a
value =
a
mask a -> a -> a
forall a. Bits a => a -> a -> a
.&. a
value a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== a
mask
clamp :: Ord a => a -> a -> a -> a
clamp :: a -> a -> a -> a
clamp a
low a
high a
value
| a
value a -> a -> Bool
forall a. Ord a => a -> a -> Bool
<= a
low = a
low
| a
value a -> a -> Bool
forall a. Ord a => a -> a -> Bool
>= a
high = a
high
| Bool
otherwise = a
value
combine :: Word8 -> Word8 -> Word8
combine :: Word8 -> Word8 -> Word8
combine Word8
high Word8
low =
Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
shiftL Word8
high Int
4 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
low
pairs :: [a] -> [(a,a)]
pairs :: [a] -> [(a, a)]
pairs (a
x:a
y:[a]
rest) = (a
x,a
y) (a, a) -> [(a, a)] -> [(a, a)]
forall a. a -> [a] -> [a]
: [a] -> [(a, a)]
forall a. [a] -> [(a, a)]
pairs [a]
rest
pairs [a]
_ = []
discretize :: (Real a, Integral b) => a -> a -> b -> b -> a -> b
discretize :: a -> a -> b -> b -> a -> b
discretize a
srcMin a
srcMax b
tgtMin b
tgtMax a
value
| a
value a -> a -> Bool
forall a. Ord a => a -> a -> Bool
<= a
srcMin = b
tgtMin
| a
value a -> a -> Bool
forall a. Ord a => a -> a -> Bool
>= a
srcMax = b
tgtMax
| Bool
otherwise = Float -> b
forall a b. (RealFrac a, Integral b) => a -> b
round (Float -> b) -> Float -> b
forall a b. (a -> b) -> a -> b
$ b -> Float
forall a b. (Integral a, Num b) => a -> b
fromIntegral b
tgtMin Float -> Float -> Float
forall a. Num a => a -> a -> a
+ Float
frac Float -> Float -> Float
forall a. Num a => a -> a -> a
* b -> Float
forall a b. (Integral a, Num b) => a -> b
fromIntegral (b
tgtMax b -> b -> b
forall a. Num a => a -> a -> a
- b
tgtMin)
where
frac :: Float
frac = (a -> Float
forall a b. (Real a, Fractional b) => a -> b
realToFrac (a
value a -> a -> a
forall a. Num a => a -> a -> a
- a
srcMin) Float -> Float -> Float
forall a. Fractional a => a -> a -> a
/ a -> Float
forall a b. (Real a, Fractional b) => a -> b
realToFrac (a
srcMax a -> a -> a
forall a. Num a => a -> a -> a
- a
srcMin)) :: Float
tripleZipWith :: (a -> b -> c) -> (a, a, a) -> (b, b, b) -> (c, c, c)
tripleZipWith :: (a -> b -> c) -> (a, a, a) -> (b, b, b) -> (c, c, c)
tripleZipWith a -> b -> c
f (a
a1, a
a2, a
a3) (b
b1, b
b2, b
b3) = (a -> b -> c
f a
a1 b
b1, a -> b -> c
f a
a2 b
b2, a -> b -> c
f a
a3 b
b3)
tripleMap :: (a -> b) -> (a, a, a) -> (b, b, b)
tripleMap :: (a -> b) -> (a, a, a) -> (b, b, b)
tripleMap a -> b
f (a
a1, a
a2, a
a3) = (a -> b
f a
a1, a -> b
f a
a2, a -> b
f a
a3)
littleEndianWord16Parser :: (Bits a, Num a) => Parser a
littleEndianWord16Parser :: Parser a
littleEndianWord16Parser = do
a
byte0 <- Word8 -> a
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word8 -> a) -> Parser ByteString Word8 -> Parser a
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser ByteString Word8
anyWord8
a
byte1 <- Word8 -> a
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word8 -> a) -> Parser ByteString Word8 -> Parser a
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser ByteString Word8
anyWord8
a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (a -> Parser a) -> a -> Parser a
forall a b. (a -> b) -> a -> b
$ a -> Int -> a
forall a. Bits a => a -> Int -> a
shiftL a
byte1 Int
8 a -> a -> a
forall a. Bits a => a -> a -> a
.|. a
byte0
tripleParser :: (Bits a, Num a) => Parser (a, a, a)
tripleParser :: Parser (a, a, a)
tripleParser = do
a
x <- Parser a
forall a. (Bits a, Num a) => Parser a
littleEndianWord16Parser
a
y <- Parser a
forall a. (Bits a, Num a) => Parser a
littleEndianWord16Parser
a
z <- Parser a
forall a. (Bits a, Num a) => Parser a
littleEndianWord16Parser
(a, a, a) -> Parser (a, a, a)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (a
x, a
y, a
z)