1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
|
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE UnicodeSyntax #-}
module Hkl.Edf
( Edf(..)
, ExtractEdf(..)
, edfP
, edfFromFile
) where
import Data.Attoparsec.Text ( Parser
, (<?>)
, anyChar
, double
, many1
, manyTill
, parseOnly
, skipSpace
, string
, takeTill
, try
)
import Data.ByteString.Char8 (readFile, split)
import Data.Text (Text, words)
import Data.Text.Encoding (decodeUtf8)
import Numeric.Units.Dimensional.Prelude (Length, (*~), nano, meter)
data Edf = Edf { edf'Lambda :: Length Double
, edf'Motors :: [(Text, Double)]
}
deriving (Show)
class ExtractEdf a where
extractEdf ∷ a → IO ()
edf'LambdaP :: Parser (Length Double)
edf'LambdaP = do
_ <- manyTill anyChar (try $ string "Lambda = ")
value <- double
pure $ value *~ nano meter
edf'MotorsP :: Parser [(Text, Double)]
edf'MotorsP = do
_ <- manyTill anyChar (try $ string "motor_pos = ")
vs <- many1 (skipSpace *> double)
_ <- manyTill anyChar (try $ string "motor_mne = ")
ns <- takeTill (\c -> c == ';')
return $ zip (Data.Text.words ns) vs
edfP :: Parser Edf
edfP = Edf
<$> edf'LambdaP
<*> edf'MotorsP
<?> "edfP"
edfFromFile :: FilePath -> IO Edf
edfFromFile filename = do
content <- Data.ByteString.Char8.readFile filename
let header = head (split '}' content)
return $ case parseOnly edfP (decodeUtf8 header) of
Left _ -> error $ "Can not parse the " ++ filename ++ " edf file"
Right a -> a
-- main :: IO ()
-- main = do
-- edf <- edfFromFile "/home/picca/test.edf"
-- print edf
-- return ()
|