import Data.List
gen2to gen [ ] = Just [ ]
gen2to gen ( x : xs ) = let
lower
= [ y
| y
<- xs
, elem ( y
, x
) gen
] higher
= [ y
| y
<- xs
, elem ( x
, y
) gen
] newgen = [ ( y, z ) | y <- lower, z <- higher ]
cont = [ ] /= ( intersect lower higher )
in if cont
then Nothing
else do
po' <- gen2to ( gen ++ newgen ) xs
let ( lowerS, higherS ) = break ( flip elem higher ) po'
return $ lowerS
++ [ x
] ++ higherS
main = do
print $ gen2to sample1
"ABC" print $ gen2to sample2
"ABCD" print $ gen2to sample3
"ABCDE"
sample1 = [ ]
++ [ ( x , 'A' ) | x <- [ 'B', 'C' ] ]
++ [ ( x , 'B' ) | x <- [ 'C' ] ]
++ [ ( x , 'C' ) | x <- [ ] ]
sample2 = [ ]
++ [ ( x , 'A' ) | x <- "C" ]
++ [ ( x , 'B' ) | x <- "D" ]
++ [ ( x , 'C' ) | x <- "BD" ]
++ [ ( x , 'D' ) | x <- "" ]
sample3 = [ ]
++ [ ( x , 'A' ) | x <- "E" ]
++ [ ( x , 'B' ) | x <- "D" ]
++ [ ( x , 'C' ) | x <- "B" ]
++ [ ( x , 'D' ) | x <- "" ]
++ [ ( x , 'E' ) | x <- "B" ]
aW1wb3J0IERhdGEuTGlzdAoKZ2VuMnRvIGdlbiBbIF0gPSBKdXN0IFsgXQpnZW4ydG8gZ2VuICggeCA6IHhzICkgPSBsZXQKICAgIGxvd2VyID0gWyB5IHwgeSA8LSB4cywgZWxlbSAoIHksIHggKSBnZW4gXQogICAgaGlnaGVyID0gIFsgeSB8IHkgPC0geHMsIGVsZW0gKCB4LCB5ICkgZ2VuIF0KICAgIG5ld2dlbiA9IFsgKCB5LCB6ICkgfCB5IDwtIGxvd2VyLCB6IDwtIGhpZ2hlciBdCiAgICBjb250ID0gWyBdIC89ICggaW50ZXJzZWN0IGxvd2VyIGhpZ2hlciApCiAgICBpbiBpZiBjb250IAogICAgICAgIHRoZW4gTm90aGluZwogICAgICAgIGVsc2UgZG8gCiAgICAgICAgICAgIHBvJyA8LSBnZW4ydG8gKCBnZW4gKysgbmV3Z2VuICkgeHMKICAgICAgICAgICAgbGV0ICggbG93ZXJTLCBoaWdoZXJTICkgPSBicmVhayAoIGZsaXAgZWxlbSBoaWdoZXIgKSBwbycKICAgICAgICAgICAgcmV0dXJuICQgbG93ZXJTICsrIFsgeCBdICsrIGhpZ2hlclMKCm1haW4gPSBkbwogICAgcHJpbnQgJCBnZW4ydG8gc2FtcGxlMSAiQUJDIgogICAgcHJpbnQgJCBnZW4ydG8gIHNhbXBsZTIgIkFCQ0QiCiAgICBwcmludCAkIGdlbjJ0byAgc2FtcGxlMyAiQUJDREUiCgpzYW1wbGUxID0gWyBdCiAgICArKyBbICggeCAsICdBJyApIHwgeCA8LSBbICdCJywgJ0MnIF0gXQogICAgKysgWyAoIHggLCAnQicgKSB8IHggPC0gWyAnQycgXSBdCiAgICArKyBbICggeCAsICdDJyApIHwgeCA8LSBbIF0gXQoKc2FtcGxlMiA9IFsgXQogICAgKysgWyAoIHggLCAnQScgKSB8IHggPC0gIkMiIF0KICAgICsrIFsgKCB4ICwgJ0InICkgfCB4IDwtICJEIiBdCiAgICArKyBbICggeCAsICdDJyApIHwgeCA8LSAiQkQiIF0KICAgICsrIFsgKCB4ICwgJ0QnICkgfCB4IDwtICIiIF0KICAgICAgICAKc2FtcGxlMyA9IFsgXQogICAgKysgWyAoIHggLCAnQScgKSB8IHggPC0gIkUiIF0KICAgICsrIFsgKCB4ICwgJ0InICkgfCB4IDwtICJEIiBdCiAgICArKyBbICggeCAsICdDJyApIHwgeCA8LSAiQiIgXQogICAgKysgWyAoIHggLCAnRCcgKSB8IHggPC0gIiIgXQogICAgKysgWyAoIHggLCAnRScgKSB8IHggPC0gIkIiIF0K