1 {-# LANGUAGE FlexibleContexts, MultiParamTypeClasses #-}
3 module RMCA.Configuration where
6 import qualified Data.Bifunctor as BF
7 import Data.ReactiveValue
8 import RMCA.Layer.Layer
12 type InstrumentNo = Int
14 data BoardConf = BoardConf { confLayer :: (Layer,InstrumentNo)
15 , confBoard :: BoardInit
19 newtype BoardInit = BoardInit { toList :: [(Pos,Cell)] } deriving(Show,Read)
21 mkInit :: Board -> BoardInit
22 mkInit = BoardInit . filter (uncurry (&&) . BF.bimap onBoard notDef) . assocs
23 where notDef (Inert,1) = False
26 boardInit :: BoardInit -> Board
27 boardInit = makeBoard . toList
29 saveConfiguration :: ( ReactiveValueRead tempo Tempo IO
30 , ReactiveValueRead layer Layer IO
31 , ReactiveValueRead board Board IO
32 , ReactiveValueRead instr InstrumentNo IO) =>
33 FilePath -> tempo -> layer -> board -> instr -> IO ()
34 saveConfiguration fp t l b i = do
35 tempo <- reactiveValueRead t
36 layer <- reactiveValueRead l
37 board <- reactiveValueRead b
38 instr <- reactiveValueRead i
39 let bc = BoardConf { confLayer = (layer,instr)
41 , confBoard = mkInit board
43 writeFile fp $ show bc
45 loadConfiguration :: ( ReactiveValueRead tempo Tempo IO
46 , ReactiveValueRead layer Layer IO
47 , ReactiveValueRead board Board IO
48 , ReactiveValueRead instr InstrumentNo IO) =>
49 FilePath -> tempo -> layer -> board -> instr -> IO ()
50 loadConfiguration fp t l b i = do
51 conf <- readMaybe <$> readFile
52 if isNothing conf then errorLoad else $ do
53 let BoardConf { confLayer = (layer,instr)
57 reactiveValueWrite t tempo
58 reactiveValueWrite l layer
59 reactiveValueWrite b $ boardInit board
60 reactiveValueWrite i instr