summaryrefslogtreecommitdiff
path: root/contrib/haskell/src/Hkl/Edf.hs
blob: 4c337392a6aa970da518f47072ffd4e620e0ab5e (plain)
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 ()