-
Notifications
You must be signed in to change notification settings - Fork 0
/
Sequence.hs
63 lines (50 loc) · 2.2 KB
/
Sequence.hs
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
{-# LANGUAGE TypeFamilies, MultiParamTypeClasses, GADTs, FlexibleInstances, ScopedTypeVariables, DeriveDataTypeable, TypeSynonymInstances, StandaloneDeriving, EmptyDataDecls, RecordWildCards, NamedFieldPuns #-}
module Control.Etage.Sequence (
SequenceNeuron,
SequenceFromImpulse,
SequenceForImpulse,
SequenceOptions,
NeuronFromImpulse(..),
NeuronForImpulse,
NeuronOptions(..)
) where
import Control.Concurrent
import Control.Monad
import Data.Typeable
import System.Random
import Control.Etage
defaultMaxInterval :: Int
defaultMaxInterval = 1000000 -- microseconds
data (Real r, Random r, Show r, Typeable r) => SequenceNeuron r = SequenceNeuron (SequenceOptions r) deriving (Typeable)
type SequenceFromImpulse r = NeuronFromImpulse (SequenceNeuron r)
type SequenceForImpulse r = NeuronForImpulse (SequenceNeuron r)
type SequenceOptions r = NeuronOptions (SequenceNeuron r)
instance (Real r, Random r, Show r, Typeable r) => Impulse (SequenceFromImpulse r) where
impulseTime Value { .. } = impulseTimestamp
impulseValue Value { .. } = [toRational value]
instance (Real r, Random r, Show r, Typeable r) => Impulse (SequenceForImpulse r) where
impulseTime _ = undefined
impulseValue _ = undefined
deriving instance Show (SequenceForImpulse r)
instance (Real r, Random r, Show r, Typeable r) => Neuron (SequenceNeuron r) where
data NeuronFromImpulse (SequenceNeuron r) = Value {
impulseTimestamp :: ImpulseTime, -- time is first so that ordering is first by time
value :: r
} deriving (Eq, Ord, Read, Show)
data NeuronForImpulse (SequenceNeuron r)
data NeuronOptions (SequenceNeuron r) = SequenceOptions {
valueSource :: [r],
intervalSource :: [Int] -- microseconds
} deriving (Eq, Ord, Read, Show)
mkDefaultOptions = do
generator <- newStdGen
generator' <- newStdGen
return SequenceOptions {
valueSource = randoms generator,
intervalSource = randomRs (0, defaultMaxInterval) generator'
}
grow options = return $ SequenceNeuron options
live nerve (SequenceNeuron SequenceOptions { .. }) = forM_ (zip valueSource intervalSource) $ \(v, i) -> do
time <- getCurrentImpulseTime
sendFromNeuron nerve $ Value time v
threadDelay i