Skip to content

Commit 2bd39b8

Browse files
authored
Merge pull request #19 from haskell-works/safe-and-unsafe-functions
Safe and unsafe functions
2 parents 196b3c1 + f0ad060 commit 2bd39b8

File tree

4 files changed

+43
-31
lines changed

4 files changed

+43
-31
lines changed

Diff for: app/App/Commands/Capabilities.hs

+7-7
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,21 @@ module App.Commands.Capabilities
44
( cmdCapabilities
55
) where
66

7-
import Data.Semigroup ((<>))
8-
import Options.Applicative hiding (columns)
7+
import Data.Semigroup ((<>))
8+
import HaskellWorks.Data.Json.Simd.Index.Simple
9+
import HaskellWorks.Data.Json.Simd.Index.Standard
10+
import Options.Applicative hiding (columns)
911

10-
import qualified HaskellWorks.Data.Json.Simd.Index.Simple as SIMPLE
11-
import qualified HaskellWorks.Data.Json.Simd.Index.Standard as STANDARD
12-
import qualified System.IO as IO
12+
import qualified System.IO as IO
1313

1414
{-# ANN module ("HLint: ignore Reduce duplication" :: String) #-}
1515
{-# ANN module ("HLint: ignore Redundant do" :: String) #-}
1616

1717
runCapabilities :: () -> IO ()
1818
runCapabilities opts = do
1919
IO.putStrLn "Capabalities:"
20-
IO.putStrLn $ " standard indexing: " <> show STANDARD.enabled
21-
IO.putStrLn $ " simple indexing: " <> show SIMPLE.enabled
20+
IO.putStrLn $ " standard indexing: " <> show enabledMakeStandardJsonIbBps
21+
IO.putStrLn $ " simple indexing: " <> show enabledMakeSimpleJsonIbBps
2222

2323
optsCapabilities :: Parser ()
2424
optsCapabilities = pure ()

Diff for: app/App/Commands/CreateIndex.hs

+12-12
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,17 @@ import App.Commands.Types
88
import Control.Lens
99
import Control.Monad
1010
import Data.Maybe
11-
import Data.Semigroup ((<>))
12-
import Options.Applicative hiding (columns)
11+
import Data.Semigroup ((<>))
12+
import HaskellWorks.Data.Json.Simd.Index.Simple
13+
import HaskellWorks.Data.Json.Simd.Index.Standard
14+
import Options.Applicative hiding (columns)
1315

14-
import qualified App.Lens as L
15-
import qualified Data.ByteString as BS
16-
import qualified Data.ByteString.Lazy as LBS
17-
import qualified HaskellWorks.Data.ByteString.Lazy as LBS
18-
import qualified HaskellWorks.Data.Json.Simd.Index.Simple as SIMPLE
19-
import qualified HaskellWorks.Data.Json.Simd.Index.Standard as STANDARD
20-
import qualified System.Exit as IO
21-
import qualified System.IO as IO
16+
import qualified App.Lens as L
17+
import qualified Data.ByteString as BS
18+
import qualified Data.ByteString.Lazy as LBS
19+
import qualified HaskellWorks.Data.ByteString.Lazy as LBS
20+
import qualified System.Exit as IO
21+
import qualified System.IO as IO
2222

2323
{-# ANN module ("HLint: ignore Reduce duplication" :: String) #-}
2424
{-# ANN module ("HLint: ignore Redundant do" :: String) #-}
@@ -34,7 +34,7 @@ runCreateIndex opts = do
3434
"simple" -> do
3535
IO.withFile filePath IO.ReadMode $ \hIn -> do
3636
contents <- LBS.resegmentPadded 512 <$> LBS.hGetContents hIn
37-
let chunks = SIMPLE.makeIbBps contents
37+
let chunks = makeSimpleJsonIbBpsUnsafe contents
3838
IO.withFile outputIbFile IO.WriteMode $ \hIb -> do
3939
IO.withFile outputBpFile IO.WriteMode $ \hBp -> do
4040
forM_ chunks $ \(ibBs, bpBs) -> do
@@ -43,7 +43,7 @@ runCreateIndex opts = do
4343
"standard" -> do
4444
IO.withFile filePath IO.ReadMode $ \hIn -> do
4545
contents <- LBS.resegmentPadded 512 <$> LBS.hGetContents hIn
46-
let chunks = STANDARD.makeIbBps contents
46+
let chunks = makeStandardJsonIbBpsUnsafe contents
4747
IO.withFile outputIbFile IO.WriteMode $ \hIb -> do
4848
IO.withFile outputBpFile IO.WriteMode $ \hBp -> do
4949
forM_ chunks $ \(ibBs, bpBs) -> do

Diff for: src/HaskellWorks/Data/Json/Simd/Index/Simple.hs

+12-6
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,9 @@
22
{-# LANGUAGE RankNTypes #-}
33

44
module HaskellWorks.Data.Json.Simd.Index.Simple
5-
( makeIbBps
6-
, enabled
5+
( makeSimpleJsonIbBps
6+
, makeSimpleJsonIbBpsUnsafe
7+
, enabledMakeSimpleJsonIbBps
78
) where
89

910
import Control.Monad.ST
@@ -27,8 +28,13 @@ import qualified System.IO.Unsafe as IO
2728
{-# ANN module ("HLint: ignore Reduce duplication" :: String) #-}
2829
{-# ANN module ("HLint: ignore Redundant do" :: String) #-}
2930

30-
makeIbBps :: LBS.ByteString -> [(BS.ByteString, BS.ByteString)]
31-
makeIbBps lbs = L.zipPadded BS.empty BS.empty ibs bps
31+
makeSimpleJsonIbBps :: LBS.ByteString -> Either String [(BS.ByteString, BS.ByteString)]
32+
makeSimpleJsonIbBps lbs = if enabledMakeSimpleJsonIbBps
33+
then Right (makeSimpleJsonIbBpsUnsafe lbs)
34+
else Left "makeSimpleJsonIbBps function is disabled"
35+
36+
makeSimpleJsonIbBpsUnsafe :: LBS.ByteString -> [(BS.ByteString, BS.ByteString)]
37+
makeSimpleJsonIbBpsUnsafe lbs = L.zipPadded BS.empty BS.empty ibs bps
3238
where chunks = makeIbs lbs
3339
ibs = fmap (\(a, _, _) -> a) chunks
3440
bps = ibsToIndexByteStrings chunks
@@ -138,5 +144,5 @@ stepToByteString state (Step step size) = F.unsafeLocalState $ do
138144
w64Size <- stToIO $ step state bpVm
139145
return (BSI.PS bpFptr 0 (w64Size * 8))
140146

141-
enabled :: Bool
142-
enabled = C.avx_2 && C.sse_4_2 && C.bmi_2
147+
enabledMakeSimpleJsonIbBps :: Bool
148+
enabledMakeSimpleJsonIbBps = C.avx_2 && C.sse_4_2 && C.bmi_2

Diff for: src/HaskellWorks/Data/Json/Simd/Index/Standard.hs

+12-6
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,9 @@
44
{-# LANGUAGE ScopedTypeVariables #-}
55

66
module HaskellWorks.Data.Json.Simd.Index.Standard
7-
( makeIbBps
8-
, enabled
7+
( makeStandardJsonIbBps
8+
, makeStandardJsonIbBpsUnsafe
9+
, enabledMakeStandardJsonIbBps
910
) where
1011

1112
import Control.Monad
@@ -27,8 +28,13 @@ import qualified System.IO.Unsafe as IO
2728
{-# ANN module ("HLint: ignore Reduce duplication" :: String) #-}
2829
{-# ANN module ("HLint: ignore Redundant do" :: String) #-}
2930

30-
makeIbBps :: LBS.ByteString -> [(BS.ByteString, BS.ByteString)]
31-
makeIbBps lbs = F.unsafeLocalState $ do
31+
makeStandardJsonIbBps :: LBS.ByteString -> Either String [(BS.ByteString, BS.ByteString)]
32+
makeStandardJsonIbBps lbs = if enabledMakeStandardJsonIbBps
33+
then Right (makeStandardJsonIbBpsUnsafe lbs)
34+
else Left "makeStandardJsonIbBps function is disabled"
35+
36+
makeStandardJsonIbBpsUnsafe :: LBS.ByteString -> [(BS.ByteString, BS.ByteString)]
37+
makeStandardJsonIbBpsUnsafe lbs = F.unsafeLocalState $ do
3238
wb <- allocWorkBuffers (32 * 1024 * 1204)
3339
ws <- newWorkState 0
3440
fptrState :: F.ForeignPtr F.UInt32 <- F.mallocForeignPtr
@@ -102,5 +108,5 @@ makeIbBps lbs = F.unsafeLocalState $ do
102108
rs <- IO.unsafeInterleaveIO $ go wb ws fptrState fptrRemBits fptrRemBitsLen bss
103109
return (r:rs)
104110

105-
enabled :: Bool
106-
enabled = C.avx_2 && C.sse_4_2 && C.bmi_2
111+
enabledMakeStandardJsonIbBps :: Bool
112+
enabledMakeStandardJsonIbBps = C.avx_2 && C.sse_4_2 && C.bmi_2

0 commit comments

Comments
 (0)