-from Text import class Text(join,toUpperCase), instance Text String
-
-toByteVal :: BC -> String
-toByteVal a = undef
-
-derive gPrint BC, AnalogPin
-derive consIndex BC
-derive consName BC
-
-toReadableByteVal :: BC -> String
-toReadableByteVal a = printToString a
+from Text import class Text(concat,join,toUpperCase), instance Text String
+
+toByteVal :: BC -> [Char]
+toByteVal b
+# bt = toBC b
+= [bt:case b of
+ (BCPush i) = i
+ (BCAnalogRead i) = [toChar i]
+ (BCAnalogWrite i) = [toChar i]
+ (BCDigitalRead i) = [toChar i]
+ (BCDigitalWrite i) = [toChar i]
+ (BCJmp i) = [toChar i]
+ (BCJmpT i) = [toChar i]
+ (BCJmpF i) = [toChar i]
+ _ = []]
+ where
+ toBC b = toChar $ consIndex{|*|} b + 1
+
+instance Semigroup (ByteCode a p) where
+ mappend m n = BC \s->let (b1, (b2, t)) = runBC m <$> runBC m s in (b1 ++ b2, t)
+
+instance Monoid (ByteCode a p) where
+ mempty = retrn []
+
+(<++>) infixl 2 :: (ByteCode a p) (ByteCode b q) -> ByteCode c r
+(<++>) m n = BC \s->let (b1, (b2, t)) = runBC n <$> runBC m s in (b1 ++ b2, t)
+
+(<+->) infixr 1
+(<+->) m n :== m <++> retrn n
+
+runBC (BC m) = m
+
+retrn :: ([BC] -> ByteCode a p)
+retrn = BC o tuple
+
+instance toByteCode Bool where
+ toByteCode True = [toChar 1]
+ toByteCode False = [toChar 0]
+instance toByteCode Int where toByteCode n = map toChar [n/(2<<7),n rem 265]
+instance toByteCode Long where toByteCode (L n) = toByteCode n
+instance toByteCode Char where toByteCode c = [c]
+instance toByteCode String where toByteCode s = undef
+instance toByteCode Button where toByteCode s = [toChar $ consIndex{|*|} s]
+
+instance toChar Pin where
+ toChar (Digital p) = toChar $ consIndex{|*|} p + 1
+ toChar (Analog p) = toChar $ consIndex{|*|} p + 1
+
+derive gPrint BC, AnalogPin, Pin, DigitalPin
+derive consIndex BC, Pin, Button
+derive consName BC, Pin, Button