Skip to content

Commit 5ddf167

Browse files
committed
feat: more changes for disable-lens flag
remove dependency on exceptions disable linear when flag is true add to github actions
1 parent 4173cd9 commit 5ddf167

5 files changed

Lines changed: 139 additions & 56 deletions

File tree

.github/workflows/cabal-build.yml

Lines changed: 9 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@ jobs:
1717
fail-fast: false
1818
matrix:
1919
os: [ubuntu-latest, windows-latest, macos-latest]
20-
ghc-version: ["9.8", "9.6", "9.2"]
20+
ghc-version: ["9.12", "9.10", "9.6", "9.2"]
21+
lens: [true, false]
2122
exclude:
2223
- os: macos-latest
2324
ghc-version: "9.2"
@@ -43,33 +44,18 @@ jobs:
4344
sudo apt install -y x11proto-xext-dev libx11-dev xorg-dev freeglut3-dev
4445
4546
- name: Configure the build
47+
if: matrix.lens
4648
run: |
4749
cabal configure --enable-tests --enable-benchmarks --disable-documentation
4850
cabal build --dry-run
4951
# The last step generates dist-newstyle/cache/plan.json for the cache key.
5052

51-
# IMPT: Uncomment when adding steps after cabal build
52-
# - name: Restore cached dependencies
53-
# uses: actions/cache/restore@v4
54-
# id: cache
55-
# env:
56-
# key: ${{ runner.os }}-ghc-${{ steps.setup.outputs.ghc-version }}-cabal-${{ steps.setup.outputs.cabal-version }}
57-
# with:
58-
# path: ${{ steps.setup.outputs.cabal-store }}
59-
# key: ${{ env.key }}-plan-${{ hashFiles('**/plan.json') }}
60-
# restore-keys: ${{ env.key }}-
61-
62-
# - name: Install dependencies
63-
# run: cabal build all --only-dependencies
64-
65-
# # Cache dependencies already here, so that we do not have to rebuild them should the subsequent steps fail.
66-
# - name: Save cached dependencies
67-
# uses: actions/cache/save@v4
68-
# # Caches are immutable, trying to save with the same key would error.
69-
# if: ${{ steps.cache.outputs.cache-primary-key != steps.cache.outputs.cache-matched-key }}
70-
# with:
71-
# path: ${{ steps.setup.outputs.cabal-store }}
72-
# key: ${{ steps.cache.outputs.cache-primary-key }}
53+
- name: Configure the build (no lens)
54+
if: ${{ !matrix.lens }}
55+
run: |
56+
cabal configure --enable-tests --enable-benchmarks --disable-documentation -fdisable-lens
57+
cabal build --dry-run
58+
# The last step generates dist-newstyle/cache/plan.json for the cache key.
7359

7460
- name: Build
7561
run: cabal build all

h-raylib.cabal

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -254,14 +254,13 @@ library
254254
, base >=4.0 && <4.22
255255
, bytestring >=0.11.0 && <0.13
256256
, containers >=0.6.0 && <0.9
257-
, exceptions >=0.10.4 && <0.11
258-
, linear >=1.22 && <1.24
259257
, template-haskell >=2.16.0.0 && <2.24
260258
, text >=2.0 && <2.2
261259

262260

263261
if !flag(disable-lens)
264262
build-depends:
263+
, linear >=1.22 && <1.24
265264
, lens >=4.0 && <5.4
266265

267266
hs-source-dirs: src
@@ -379,3 +378,6 @@ library
379378

380379
if flag(ghci)
381380
cpp-options: -DGHCI
381+
382+
if flag(disable-lens)
383+
cpp-options: -DDISABLE_LENS

src/Raylib/Internal/Foreign.hs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,13 @@ import qualified Data.Text.Encoding as TE
4444
import Foreign (FunPtr, Ptr, Storable (peek, peekByteOff, poke, sizeOf), allocaBytes, castPtr, malloc, newArray, nullPtr, peekArray, plusPtr, pokeArray0, with, withArray, withArrayLen)
4545
import Foreign.C (CFloat, CInt, CString, CUChar, CUInt, peekCString, withCString)
4646
import Foreign.C.Types (CBool, CChar, CShort, CUShort)
47+
48+
#ifndef DISABLE_LENS
49+
4750
import Linear (V2, V3, V4)
4851

52+
#endif
53+
4954
-- Internal utility functions
5055

5156
#ifdef WEB_FFI
@@ -111,12 +116,16 @@ instance (Freeable a, Storable a) => Freeable [a] where
111116
let val = arr !! i in rlFreeDependents val (plusPtr ptr (i * sizeOf val))
112117
)
113118

119+
#ifndef DISABLE_LENS
120+
114121
instance Freeable (V2 a)
115122

116123
instance Freeable (V3 a)
117124

118125
instance Freeable (V4 a)
119126

127+
#endif
128+
120129
rlFreeMaybeArray :: (Freeable a, Storable a) => Maybe [a] -> Ptr a -> IO ()
121130
rlFreeMaybeArray Nothing _ = return ()
122131
rlFreeMaybeArray (Just arr) ptr = rlFree arr (castPtr ptr)

src/Raylib/Types/Core.hs

Lines changed: 104 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
{-# LANGUAGE PatternSynonyms #-}
33
{-# LANGUAGE TypeSynonymInstances #-}
44
{-# LANGUAGE FlexibleInstances #-}
5+
{-# LANGUAGE CPP #-}
56

67
-- | Bindings for types used in all raylib modules
78
module Raylib.Types.Core
@@ -140,10 +141,15 @@ import Foreign.C
140141
newCString,
141142
peekCString,
142143
)
143-
import Linear (V2(V2), V3(V3), V4(V4))
144144
import Raylib.Internal (Closeable(..), _unloadAutomationEventList, addAutomationEventList)
145145
import Raylib.Internal.Foreign (Freeable (rlFreeDependents), c'free, peekStaticArray, pokeStaticArray)
146146

147+
#ifndef DISABLE_LENS
148+
149+
import Linear (V2(V2), V3(V3), V4(V4))
150+
151+
#endif
152+
147153

148154
---------------------------------------
149155
-- core enums -------------------------
@@ -659,44 +665,106 @@ instance Enum Gesture where
659665
-- core structures --------------------
660666
---------------------------------------
661667

668+
pattern Vector2 :: Float -> Float -> Vector2
669+
pattern Vector3 :: Float -> Float -> Float -> Vector3
670+
pattern Vector4 :: Float -> Float -> Float -> Float -> Vector4
671+
672+
#ifdef DISABLE_LENS
673+
674+
data Vector2' = Vector2' Float Float deriving (Eq, Show, Freeable)
675+
instance Storable Vector2' where
676+
sizeOf _ = 8
677+
alignment _ = 4
678+
peek _p = do
679+
x <- realToFrac <$> peek (p'vector2'x _p)
680+
y <- realToFrac <$> peek (p'vector2'y _p)
681+
return $ Vector2' x y
682+
poke _p (Vector2' x y) = do
683+
poke (p'vector2'x _p) (realToFrac x)
684+
poke (p'vector2'y _p) (realToFrac y)
685+
return ()
686+
type Vector2 = Vector2'
687+
688+
pattern Vector2
689+
{ vector2'x ,
690+
vector2'y
691+
} = Vector2' vector2'x vector2'y
692+
{-# COMPLETE Vector2 :: Vector2' #-}
693+
694+
data Vector3' = Vector3' Float Float Float deriving (Eq, Show, Freeable)
695+
696+
instance Storable Vector3' where
697+
sizeOf _ = 12
698+
alignment _ = 4
699+
peek _p = do
700+
x <- realToFrac <$> peek (p'vector3'x _p)
701+
y <- realToFrac <$> peek (p'vector3'y _p)
702+
z <- realToFrac <$> peek (p'vector3'z _p)
703+
return $ Vector3' x y z
704+
poke _p (Vector3' x y z) = do
705+
poke (p'vector3'x _p) (realToFrac x)
706+
poke (p'vector3'y _p) (realToFrac y)
707+
poke (p'vector3'z _p) (realToFrac z)
708+
return ()
709+
710+
type Vector3 = Vector3'
711+
712+
pattern Vector3
713+
{ vector3'x ,
714+
vector3'y ,
715+
vector3'z
716+
} = Vector3' vector3'x vector3'y vector3'z
717+
{-# COMPLETE Vector3 :: Vector3' #-}
718+
719+
data Vector4' = Vector4' Float Float Float Float deriving (Eq, Show, Freeable)
720+
721+
instance Storable Vector4' where
722+
sizeOf _ = 16
723+
alignment _ = 4
724+
peek _p = do
725+
x <- realToFrac <$> peek (p'vector4'x _p)
726+
y <- realToFrac <$> peek (p'vector4'y _p)
727+
z <- realToFrac <$> peek (p'vector4'z _p)
728+
w <- realToFrac <$> peek (p'vector4'w _p)
729+
return $ Vector4' x y z w
730+
poke _p (Vector4' x y z w) = do
731+
poke (p'vector4'x _p) (realToFrac x)
732+
poke (p'vector4'y _p) (realToFrac y)
733+
poke (p'vector4'z _p) (realToFrac z)
734+
poke (p'vector4'w _p) (realToFrac w)
735+
return ()
736+
737+
type Vector4 = Vector4'
738+
739+
pattern Vector4
740+
{ vector4'x,
741+
vector4'y,
742+
vector4'z,
743+
vector4'w
744+
} = Vector4' vector4'x vector4'y vector4'z vector4'w
745+
{-# COMPLETE Vector4 :: Vector4' #-}
746+
747+
#else
662748

663749
type Vector2 = V2 Float
664750

665-
pattern Vector2 :: Float -> Float -> Vector2
666751
pattern Vector2
667752
{ vector2'x ,
668753
vector2'y
669754
} = V2 vector2'x vector2'y
670755
{-# COMPLETE Vector2 :: V2 #-}
671756

672-
p'vector2'x :: Ptr Vector2 -> Ptr CFloat
673-
p'vector2'x = (`plusPtr` 0)
674-
675-
p'vector2'y :: Ptr Vector2 -> Ptr CFloat
676-
p'vector2'y = (`plusPtr` 4)
677-
678757
type Vector3 = V3 Float
679758

680-
pattern Vector3 :: Float -> Float -> Float -> Vector3
681759
pattern Vector3
682760
{ vector3'x ,
683761
vector3'y ,
684762
vector3'z
685763
} = V3 vector3'x vector3'y vector3'z
686764
{-# COMPLETE Vector3 :: V3 #-}
687765

688-
p'vector3'x :: Ptr Vector3 -> Ptr CFloat
689-
p'vector3'x = (`plusPtr` 0)
690-
691-
p'vector3'y :: Ptr Vector3 -> Ptr CFloat
692-
p'vector3'y = (`plusPtr` 4)
693-
694-
p'vector3'z :: Ptr Vector3 -> Ptr CFloat
695-
p'vector3'z = (`plusPtr` 8)
696-
697766
type Vector4 = V4 Float
698767

699-
pattern Vector4 :: a -> a -> a -> a -> V4 a
700768
pattern Vector4
701769
{ vector4'x,
702770
vector4'y,
@@ -705,6 +773,23 @@ pattern Vector4
705773
} = V4 vector4'x vector4'y vector4'z vector4'w
706774
{-# COMPLETE Vector4 :: V4 #-}
707775

776+
#endif
777+
778+
p'vector2'x :: Ptr Vector2 -> Ptr CFloat
779+
p'vector2'x = (`plusPtr` 0)
780+
781+
p'vector2'y :: Ptr Vector2 -> Ptr CFloat
782+
p'vector2'y = (`plusPtr` 4)
783+
784+
p'vector3'x :: Ptr Vector3 -> Ptr CFloat
785+
p'vector3'x = (`plusPtr` 0)
786+
787+
p'vector3'y :: Ptr Vector3 -> Ptr CFloat
788+
p'vector3'y = (`plusPtr` 4)
789+
790+
p'vector3'z :: Ptr Vector3 -> Ptr CFloat
791+
p'vector3'z = (`plusPtr` 8)
792+
708793
vectorToColor :: Vector4 -> Color
709794
vectorToColor (Vector4 x y z w) = Color (round $ x * 255) (round $ y * 255) (round $ z * 255) (round $ w * 255)
710795

src/Raylib/Util.hs

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@ module Raylib.Util
3535
where
3636

3737
import Control.Monad (void)
38-
import Control.Monad.Catch (MonadMask, bracket, bracket_)
3938
import Control.Monad.IO.Class (MonadIO (liftIO))
4039
import Raylib.Core (beginBlendMode, beginDrawing, beginMode2D, beginMode3D, beginScissorMode, beginShaderMode, beginTextureMode, beginVrStereoMode, closeWindow, endBlendMode, endDrawing, endMode2D, endMode3D, endScissorMode, endShaderMode, endTextureMode, endVrStereoMode, initWindow, setTargetFPS, windowShouldClose)
4140
import Raylib.Internal (WindowResources, Closeable (..), managed)
@@ -52,6 +51,7 @@ import Raylib.Types
5251
VrStereoConfig,
5352
)
5453
import Raylib.Util.Math (Vector (vectorNormalize, (|-|)))
54+
import Control.Exception (bracket, bracket_)
5555

5656
#ifdef WEB_FFI
5757

@@ -66,10 +66,11 @@ import Language.Haskell.TH.Syntax (Name (Name), OccName (OccName))
6666

6767
#endif
6868

69+
70+
6971
-- | NOTE: Only for native targets. If your program is intended to
7072
-- run on the web, use `raylibApplication` instead.
7173
withWindow ::
72-
(MonadIO m, MonadMask m) =>
7374
-- | Window width
7475
Int ->
7576
-- | Window height
@@ -78,32 +79,32 @@ withWindow ::
7879
String ->
7980
-- | Target FPS
8081
Int ->
81-
(WindowResources -> m b) ->
82-
m b
82+
(WindowResources -> IO b) ->
83+
IO b
8384
withWindow w h title fps = bracket (liftIO $ initWindow w h title <* setTargetFPS fps) (liftIO . closeWindow . Just)
8485

85-
drawing :: (MonadIO m, MonadMask m) => m b -> m b
86+
drawing :: IO b -> IO b
8687
drawing = bracket_ (liftIO beginDrawing) (liftIO endDrawing)
8788

88-
mode2D :: (MonadIO m, MonadMask m) => Camera2D -> m b -> m b
89+
mode2D :: Camera2D -> IO b -> IO b
8990
mode2D camera = bracket_ (liftIO (beginMode2D camera)) (liftIO endMode2D)
9091

91-
mode3D :: (MonadIO m, MonadMask m) => Camera3D -> m b -> m b
92+
mode3D :: Camera3D -> IO b -> IO b
9293
mode3D camera = bracket_ (liftIO (beginMode3D camera)) (liftIO endMode3D)
9394

94-
textureMode :: (MonadIO m, MonadMask m) => RenderTexture -> m b -> m b
95+
textureMode :: RenderTexture -> IO b -> IO b
9596
textureMode rt = bracket_ (liftIO (beginTextureMode rt)) (liftIO endTextureMode)
9697

97-
shaderMode :: (MonadIO m, MonadMask m) => Shader -> m b -> m b
98+
shaderMode :: Shader -> IO b -> IO b
9899
shaderMode shader = bracket_ (liftIO (beginShaderMode shader)) (liftIO endShaderMode)
99100

100-
blendMode :: (MonadIO m, MonadMask m) => BlendMode -> m b -> m b
101+
blendMode :: BlendMode -> IO b -> IO b
101102
blendMode bm = bracket_ (liftIO (beginBlendMode bm)) (liftIO endBlendMode)
102103

103-
scissorMode :: (MonadIO m, MonadMask m) => Int -> Int -> Int -> Int -> m b -> m b
104+
scissorMode :: Int -> Int -> Int -> Int -> IO b -> IO b
104105
scissorMode x y width height = bracket_ (liftIO (beginScissorMode x y width height)) (liftIO endScissorMode)
105106

106-
vrStereoMode :: (MonadIO m, MonadMask m) => VrStereoConfig -> m b -> m b
107+
vrStereoMode :: VrStereoConfig -> IO b -> IO b
107108
vrStereoMode config = bracket_ (liftIO (beginVrStereoMode config)) (liftIO endVrStereoMode)
108109

109110
-- | Gets the direction of a camera as a ray.

0 commit comments

Comments
 (0)